【问题标题】:Adding Components To JFrame in separate Thread在单独的线程中将组件添加到 JFrame
【发布时间】:2014-03-13 02:43:17
【问题描述】:

我正在编写各种向导,并希望使用方法切换显示的内容。每次运行此代码时,都会出现空指针异常。

    public class EventDispatch {

       public static void main(String [] args){
            WizardScreen wiz = new WizardScreen();
            new Thread(wiz).start();
            wiz.welcomeScreen();
       }
    }

    public class WizardScreen implements Runnable{

protected JFrame wizardFrame;
protected JPanel contentPane;
protected JButton newQuote; 
protected JButton openQuote;
protected JLabel title;
GridBagConstraints c;


public WizardScreen(){
    wizardFrame = new JFrame();
    contentPane = new JPanel(new GridBagLayout());
    wizardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    wizardFrame.setSize(550, 450);
    wizardFrame.setResizable(false);
    wizardFrame.setLocationRelativeTo(null);
    wizardFrame.setTitle("Welcome!");
    wizardFrame.setContentPane(contentPane);
    wizardFrame.setVisible(true);
}

@Override
public void run() {
    System.out.println("Running wizardScreen");

}

public void welcomeScreen(){
    title = new JLabel("Welcome to ExSoft Quote Calculator Alpha 1.0");
    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = .5;
    contentPane.add(title, c);
    wizardFrame.validate();
    contentPane.repaint();
}

}

我做错了什么?

【问题讨论】:

  • 您能否发布完整的异常堆栈跟踪,并告诉我们它指的是您代码中的哪一行。这对于尝试确定 NullPointerException 的原因很重要
  • “在单独的线程中向 JFrame 添加组件” - 我的第一个想法是,不要。 Swing 不是线程安全的。对 UI 的所有修改或交互都应在事件调度线程的上下文中进行。看看Concurrency in Swing

标签: java multithreading swing jframe


【解决方案1】:

浏览您的代码...

首先,您创建一个 WizardScreen 的实例,并对其进行初始化

  • wizardFrame
  • contentPane

其次,你开始一个Thread...

第三,你在WizardScreen的实例上调用welcomeScreen,这会初始化......

  • title

然后它尝试访问 cgridx 属性...尚未初始化...

您应该检查过NullPointerException 提供给您的信息...

Exception in thread "main" java.lang.NullPointerException
    at eventdispatch.EventDispatch$WizardScreen.welcomeScreen(EventDispatch.java:52)
    at eventdispatch.EventDispatch.main(EventDispatch.java:20)

明确说明异常发生的位置,这对您和我们来说都是非常宝贵的信息。

请注意,Swing 不是线程安全的,对 UI 的所有交互和修改都应该在事件调度线程的上下文中发生。见Concurrency in Swing

仅供参考:

通常建议使用setSize 中的pack,这应该在您致电setVisible 之前最后完成。还要注意,使用setResizable(false) 会改变窗口的大小...

wizardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//wizardFrame.setSize(550, 450);
//wizardFrame.setResizable(false);
//wizardFrame.setLocationRelativeTo(null);
wizardFrame.setTitle("Welcome!");
wizardFrame.setContentPane(contentPane);
wizardFrame.setResizable(false);
wizardFrame.pack();
wizardFrame.setLocationRelativeTo(null);
wizardFrame.setVisible(true);

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多