如何更改JPanel';这是另一个班级的颜色。JAVA

如何更改JPanel';这是另一个班级的颜色。JAVA,java,swing,Java,Swing,我在更改另一个类的JPanels颜色时遇到问题。 我试图通过点击一个按钮来改变它。我正在创建一个应用程序,用户可以选择自己想要的颜色主题 头等舱: public class First extends JFrame { public JPanel contentPane = new JPanel(); public JPanel panel = new JPanel(); public First() { JButton btnNewButton =

我在更改另一个类的JPanels颜色时遇到问题。 我试图通过点击一个按钮来改变它。我正在创建一个应用程序,用户可以选择自己想要的颜色主题

头等舱:

public class First extends JFrame {

    public JPanel contentPane = new JPanel();
    public JPanel panel = new JPanel();

    public First() {

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Second s = new Second();
                s.startSecond();
            }
        });
    }
 }
二等舱:

public class Second extends JFrame {
    First f;
    private JPanel contentPane;

    public static void startSecond() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Second sframe = new faijaso();
                    sframe.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Second() {   
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                f.panel.setBackground(Color.red);
                f.panel.repaint();
                f.panel.revalidate();
            }
        });
    }

}

这段代码有几个问题,但最重要的是,您的
第一个f
变量从未初始化过,因此,如果您试图从中调用方法,程序将抛出NullPointerException。您当然不想创建一个
newfirst()
并将其分配给
f
,因为该实例将与已经存在的可视化First不同。而是将第二个构造函数更改为接受第一个参数,然后在调用第二个构造函数时传入当前实例

public Second(First f) {   
    this.f = f;
    // ....
首先:

public First() {

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Second s = new Second();
            s.startSecond(First.this);  // pass in the First instance
        }
    });
}
其他问题--

  • 在第二秒内去掉静态代码,因为不需要这样做。而是将第二个设置为在第一个ActionListener中可见
  • 您确实不想使用两个JFrame,此链接将告诉您原因:
  • 取而代之的是第二个JDialog

请告诉我您遇到的问题。快速浏览一下代码,这似乎会引发NullPointerException,因为我看不到第二个变量中的第一个变量是否已初始化。此外,对于告诉您最佳做法但无法解决当前问题的一般相关建议,请查看它,看起来您希望将第一个的
这个
实例传递到第二个的构造函数中,并使用它初始化
f
变量。您将希望在第二秒内摆脱静态代码,而是在其构造函数中连接GUI。感谢您的快速回答!我会用JDialog试试。@Qubek:只要你明白这不是你当前问题的原因。当前的问题源于未正确初始化
f
变量。