【问题标题】:JFrame not displaying contentsJFrame不显示内容
【发布时间】:2013-12-11 22:05:09
【问题描述】:

我知道这个问题被问了很多,但我阅读了大约 10 篇不同的文章,所有文章都推荐了不同的东西,例如“frame = this”nad frame.add(d)”我不知道为什么,但没有一个这些一直在工作。我输入了一些东西,程序运行良好,除了 Jbuttons 直到我点击 JFrame 几次才会出现。在对该代码进行一些调整之后,我回到了开始。现在我得到一个错误:

Exception in thread "main" java.lang.NullPointerException
at Guis.Dynamic_JFrame.<init>(Dynamic_JFrame.java:37)
at Guis.Dynamic_JFrame.main(Dynamic_JFrame.java:46)

这是我的代码:

public class Dynamic_JFrame extends JFrame{

static JFrame frame;
Graphics g;
Handler handler = new Handler();

JButton red = new JButton();
JButton green = new JButton();
JButton orange = new JButton();

public Dynamic_JFrame(){

    red.setText("RED");
    green.setText("GREEN");
    orange.setText("orange");

    add(green);
    add(red);
    add(orange);

    red.addActionListener(handler);
    green.addActionListener(handler);
    orange.addActionListener(handler);

    frame.setVisible(true);

}

public static void main(String[] args){
    Dynamic_JFrame d = new Dynamic_JFrame();
    frame = new JFrame("Changing colors");
    frame.setPreferredSize(new Dimension(500,500));
    frame.setMaximumSize(new Dimension(500,500));
    frame.setMinimumSize(new Dimension(500,500));
    frame.setLayout(new FlowLayout());
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public class Handler implements ActionListener{

    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==red){
            getContentPane().setBackground(Color.RED);
        }
        if(e.getSource()==green){
            getContentPane().setBackground(Color.GREEN);
        }
        if(e.getSource()==orange){
            getContentPane().setBackground(Color.ORANGE);
        }
    }

}


}

新代码,小改动。程序按预期工作,除了按钮在我单击它们应该在的位置之前不会更新:

JFrame frame;

public Dynamic_JFrame(){

    frame = new JFrame();
    frame = this;

    red.setText("RED");
    green.setText("GREEN");

    frame.add(green);
    frame.add(red);

    frame.setVisible(true);

}

    public static void main(String[] args){
    Dynamic_JFrame d = new Dynamic_JFrame();
    d.frame.setPreferredSize(new Dimension(500,500));
    d.frame.setMaximumSize(new Dimension(500,500));
    d.frame.setMinimumSize(new Dimension(500,500));
    d.frame.setLocationRelativeTo(null);
    d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    d.frame.setLayout(new FlowLayout());
}

【问题讨论】:

  • NullPointerException 来自于在你的构造函数中调用frame.setVisible( true ),而frame 仍然是null

标签: java swing jframe jbutton handler


【解决方案1】:

很多东西...

首先,Dynamic_JFrame 是从 JFrame 扩展而来的,所以我不知道你为什么要创建另一个框架...

其次,当Dynamic_JFrame在构造函数中调用frame.setVisible时,framenull,因为它还没有被初始化。

在我看来,最简单的解决方案是从 JPanel 之类的东西扩展 Dynamic_JFrame,然后简单地将其添加到 JFrame 的实例中

例如...

public class Dynamic_JFrame extends JPanel {

static JFrame frame;
// Not sure that this is a good idea...
Graphics g;

//...

public Dynamic_JFrame(){

    // Don't use this...
    //frame.setVisible(true);

}

public static void main(String[] args){
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            Dynamic_JFrame d = new Dynamic_JFrame();
            frame = new JFrame("Changing colors");
            frame.setLayout(new FlowLayout());
            frame.add(d);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    });
}

【讨论】:

  • 如果您在添加任何内容之前使框架可见,则会发生这种情况。通常,您应该在使其可见之前准备好 UI,或者在框架/内容窗格上调用 revalidaterepaint...
  • 感谢您的回复。我让这个类扩展了 JPanel,我让代码正常工作,除了现在我不能调用 getContentPane().setBackground();我试过 frame.setBackground() 但这没有用。我还尝试在颜色更改后重新绘制()和重新验证(),但没有,谢谢。
  • +1 @DrewWood 请用您所做的更改更新您的问题,以便我们更好地理解
  • 抱歉,我需要等待 8 小时才能回答我的问题,我的代码已全部修复并正常工作。主要是将“扩展 JFrame”更改为“扩展 JPanel”。我会尽快在答案部分发布代码。
猜你喜欢
  • 2013-03-02
  • 2019-08-03
  • 1970-01-01
  • 2012-12-11
  • 2011-12-11
  • 2019-08-20
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多