两个JFrame之间的java通信

时间:2018-03-09 09:17:48

标签: java jframe jpanel

我在下面的代码中得到了AWT-EventQueue-0空指针异常,我无法修复它。

我想要一个主框架,按下按钮即可 我打开第二帧,我可以选择创建新玩家, 它会出现在主框架中。 我传递了对构造函数的引用,但我仍然不断收到错误。

我会很高兴得到一些帮助,谢谢!

public class Main { 
   public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {                     
                 @Override
                 public void run() {
                       new App();
                 }
          });
   }
}

public class App extends JFrame {
   private MainPanel mainPanel;
   private SecondPanel secondPanel;

   public App() {
          setVisible(true);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setSize(800, 600);

          secondPanel = new SecondPanel(mainPanel);
          mainPanel = new MainPanel(secondPanel);

          add(mainPanel);
   }

}

public class MainPanel extends JPanel {
   private JTextArea textArea;
   private JScrollPane scrollPane;
   private JButton options;          


   public MainPanel(SecondPanel secondPanel) {
          textArea = new JTextArea();
          textArea.setColumns(20);
          textArea.setRows(5);
          textArea.setSize(300, 300);
          textArea.setVisible(true);
          textArea.setEditable(false);

          scrollPane = new JScrollPane(textArea);
          scrollPane.setSize(new Dimension(400, 400));


          options = new JButton("Options");
          options.addActionListener(new ActionListener() {
                 @Override
                 public void actionPerformed(ActionEvent e) {
                      secondPanel.setVisible(true);
                 }
          });


          add(scrollPane);
          add(options);

   }


   public JTextArea getTextArea() {
          return textArea;
   }


   public void setTextArea(JTextArea textArea) {
          this.textArea = textArea;
   }
}

public class SecondPanel extends JFrame {
   private JButton create, remove;
   private JPanel panel;

   public SecondPanel(MainPanel mainPanel) {
          setVisible(false);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setSize(400, 400);

          panel = new JPanel();
          panel.setLayout(new BorderLayout());

          create = new JButton("create");
          create.addActionListener(new ActionListener() {
                 @Override
                 public void actionPerformed(ActionEvent e) {
                      mainPanel.getTextArea().append("New Player Created");

                 }
          });

          remove = new JButton("remove");
          remove.addActionListener(new ActionListener() {
                 @Override
                 public void actionPerformed(ActionEvent e) {
                       mp.getTextArea().setText("Player removed");
                 }
          });

          add(panel);

          panel.add(create, BorderLayout.EAST);
          panel.add(remove, BorderLayout.WEST);
   }

}

1 个答案:

答案 0 :(得分:0)

好吧,它必须是“null”,因为在将它移交给第二个面板之前,你不会初始化你的MainPanel。

相反,创建一个自己的方法来设置第二个面板上的MainPanel并在MainPanel上设置secondPanel。

我看到你需要在构造函数中使用secondPanel来设置ActionListener。在你的“setSecondPanel(SecondPanel sPanel)”中执行此操作 - 正如我之前提到的那样,你应该创建的方法。