0

javaSpace から取得するクライアント ウィンドウを作成しています。これが使用しているコードです。

/**
 * Create the frame.
 */
public Client() 
{
    space = SpaceUtils.getSpace();
    if (space == null) 
    {
        System.err.println("Failed to find the javaspace");
        System.exit(1);
    }

    initFrame();
    setVisible(true);
    processPrintJobs();
}

ウィンドウは initFrame() 内で生成されます。その後、processPrintJobs は、新しいメッセージがあるかどうかを確認します。processPrintJobs() メソッド呼び出しをコメントアウトすると、ウィンドウは正しく描画されますが、メソッド呼び出しが存在する場合、ウィンドウには空白の四角が表示されます。

プロセスが何度もチェックされているため、ウィンドウが正しく作成されていないようです。これは、 while ループが実行される前にウィンドウが作成されるため意味がありません。

public void processPrintJobs() 
{

    while (true) 
    {
        try 
        {
            Message template = new Message();

            if (channel == null) 
            {
                System.out.println("No channel given");
            } else 
            {
                template.Channel = channel;
                // System.out.println(channel);
                template.position = new Integer(getNumber() + 1);

                Message msg = (Message) space.read(template, null,
                        Long.MAX_VALUE);

                messageList.append(msg.execute());
            }
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}
4

2 に答える 2

3

この無限whileループは、EDT.

while (true) 

単に呼び出す

setVisible(true);

JFrameすぐに塗装されることを保証するものではありません。存続期間の長いプロセスは、 SwingWorkerで処理する必要があります。

于 2012-12-12T23:04:30.157 に答える
2

使用する

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        processPrintJobs();
    }
}

しかし、一般的に、アプリケーションのアーキテクチャにはいくつかの側面が欠けています。

スレッドか何かのように。


もっと:

たとえば、ティックごとに 1 つのジョブに対してスイング タイマーを使用できます。

import javax.swing.Timer;

Client コンストラクターの最後に呼び出されます。

    Timer printJobsTimer = new Timer(100, new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            // Process a print job:

            if (channel != null) {
                Message template = new Message();
                template.Channel = channel;
                template.position = new Integer(getNumber() + 1);

                Message msg = (Message) space.read(template, null,
                        Long.MAX_VALUE);

                messageList.append(msg.execute());
            }
        }
    });
    printJobsTimer.setInitialDelay(100);
    printJobsTimer.start(); 

それ以外は、大文字で始まるクラス名と小文字で始まるクラス名だけで、構成された名前付けで問題ありませんでした。

于 2012-12-12T23:07:33.393 に答える