初始化jFrame的问题

时间:2012-12-12 22:57:10

标签: java swing jframe

我正在创建一个从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();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

此无限while循环将阻止EDT

while (true) 

只需致电

setVisible(true);

不保证会立即绘制JFrame。任何长期存在的流程都应由SwingWorker处理。

答案 1 :(得分:2)

使用

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

但总的来说,您的应用程序的体系结构缺少某些方面。

像线程或其他什么。


更多

例如,你可以使用一个摆动计时器,每一个工作单一个工作。

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(); 

对于其他人来说,组合命名就没问题了:只是以大写字母开头的类名和带小写字母的其他名字。