基本JFrame计算器

时间:2015-11-09 16:22:38

标签: java swing jframe

有人可以解释为什么我在运行时会在应用程序窗口中显示什么内容吗?

这看起来有点奇怪,我让它显示JButton就好了,直到我添加了几个,然后它似乎影响了一切。

这是我的代码:

public class Window extends JFrame {

    JButton zero, one, two, three, four, five, six, seven, eight, nine;
    JButton add, sub, mul, div, mod;
    JPanel mainPanel;
    JLabel results;

    public Window(){
        this.setSize(400, 400);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Calculator");
        this.setVisible(true);

        mainPanel = new JPanel();

        results = new JLabel("RESULTS");
        results.setToolTipText("Calculated Results");

        zero = new JButton("0");
        one = new JButton("1");
        two = new JButton("2");
        three = new JButton("3");
        four = new JButton("4");
        five = new JButton("5");
        six = new JButton("6");
        seven = new JButton("7");
        eight = new JButton("8");
        nine = new JButton("9");

        add = new JButton("+");
        sub = new JButton("-");
        mul = new JButton("*");
        div = new JButton("/");
        mod = new JButton("%");

        this.add(mainPanel);

        mainPanel.add(zero);
        mainPanel.add(one);
        mainPanel.add(two);
        mainPanel.add(three);
        mainPanel.add(four);
        mainPanel.add(five);
        mainPanel.add(six);
        mainPanel.add(seven);
        mainPanel.add(eight);
        mainPanel.add(nine);

        mainPanel.add(add);
        mainPanel.add(sub);
        mainPanel.add(mul);
        mainPanel.add(div);
        mainPanel.add(mod);

        mainPanel.add(results);

    }

    public static void main(String[] args) {
        new Window();
    }
}

2 个答案:

答案 0 :(得分:2)

当您致电setVisible(true)时,您的JFrame会被渲染并显示。

如果您在后添加了的内容,那么在您再次致电validate()pack()setVisible(true)之前,这些内容将无法显示。

  • validate()重新验证您的组件。这是"无效"每当你向它添加东西时,就像你的代码一样。它必须重新验证才能显示这些更改。
  • pack()调整您的组件(JFrame)的大小,使用任何布局管理器来计算它的大小。它还重新验证了它。
  • setVisible(true)听起来就是这样,但是因为它已经可见,所以有趣的是它还会重新验证组件。

那么,添加组件后应该怎么做:

  1. 致电setVisible()
  2. 致电validate()
  3. 第二个仅在你真正想要动态添加内容的情况下,我怀疑在这种情况下:)

    您的代码如下所示:

    mainPanel.add(results);
    
    pack();
    setVisible(true);
    

    可以删除之前对setVisible()(第18行)的调用。

    您可能也想add a layout到您的窗口,而Java™ Tutorial page on JFrames可能很有用。

答案 1 :(得分:0)

以这种方式编辑代码:

        ....
        mainPanel.add(results);
        this.setVisible(true);//Move this line to this place(at the end)
    }
    public static void main(String[] args) {
        new Window();
    }
}