GUI,JComboBox并打开一个新窗口

时间:2015-09-23 22:35:59

标签: java swing jframe actionlistener

我是Java新手,尤其是GUI新手,现在对我来说非常困惑。

我正在为一个应该有一个菜单(我假设是JComboBox)的类创建一个程序,当选择一个选项时会打开一个新窗口。我正在制作第一个选项,你单击“矩阵”,然后弹出一个新窗口,其中有两个按钮,名为“Red Pill”& “蓝色药丸”,这就是我撞墙的地方。

我已经到了能够创建新窗口的地步(不确定这是否是打开新窗口的正确路径)但是,当我尝试将新按钮添加到新窗口时窗户什么都没出现......

感谢您提供正确方向的任何帮助或指示!

public class MultiForm extends JFrame{

    private JComboBox menu;
    private JButton bluePill;
    private JButton redPill;

private static String[] fileName = {"", "The Matrix", "Another Option"};

public MultiForm() {
    super("Multi Form Program");        
    setLayout(new FlowLayout());
    menu = new JComboBox(fileName);
    add(menu);

    TheHandler handler = new TheHandler();
    menu.addActionListener(handler);        
}

private class TheHandler implements ActionListener{
    public void actionPerformed(ActionEvent event) {        
      ********************************************************************  
            //Create a new window when "The Matrix" is clicked in the JCB
            JFrame newFrame = new JFrame();
            JPanel panel = new JPanel();
            newFrame.setLayout(new FlowLayout());
            newFrame.setSize(500, 300);
            newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);

            Icon bp = new ImageIcon(getClass().getResource("Blue Pill.png"));
            bluePill = new JButton("Blue Pill", bp);
            newFrame.add(bluePill); 

            Icon rp = new ImageIcon(getClass().getResource("Red Pill.png"));
            redPill = new JButton("Red Pill", rp);
            newFrame.add(redPill);  

            add(panel);
            newFrame.setVisible(true);

    }
}

public static void main(String[] args) {
    MultiForm go = new MultiForm();
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    go.setSize(400, 200);
    go.setVisible(true);
}
}

3 个答案:

答案 0 :(得分:1)

您没有使用新JFrame中的getContentPane()方法。

您必须首先实际使用JFrame,因为您并未向 JFrame newFrame = new JFrame(); JPanel panel = new JPanel(); newFrame.setSize(300, 200); newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE); bluePill = new JButton("Blue Pill"); panel.add(bluePill); redPill = new JButton("Red Pill"); panel.add(redPill); newFrame.getContentPane().add(panel); newFrame.setVisible(true); 本身添加任何组件,而是添加到中间"面板"。

Layout

您必须向JPanel或/和JFrame添加{{1}}并使用组件的大小,但是这样您就可以了正确的道路。

在将所有组件添加到框架之后,我总是将setVisible方法放在最后。

答案 1 :(得分:1)

  

我尝试使用newFrame.add(BluePill)并创建了一个与整个窗口大小相同的按钮,它不允许我按这样添加两个按钮

这是因为默认情况下框架使用BorderLayout。除非您另行指定,否则组件将被添加到CENTER位置,但是BorderLayout只允许在其五个可用位置中的每个位置管理单个组件,因此您只看到你添加的最后一个组件。

有关详细信息,请参阅How to Use BorderLayout

  

所以我认为这不是正确的方法

这是正确的方法,你只需要使用一个布局管理器,它可以容纳更多组件或改变你添加按钮的位置

在这个小例子中,我只使用了一个FlowLayout,但你可以用什么来给你带来你想要的效果

JFrame newFrame = new JFrame();
newFrame.setLayout(new FlowLayout());
newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);

bluePill = new JButton("Blue Pill");
newFrame.add(bluePill);
redPill = new JButton("Red Pill");
newFrame.add(redPill);

newFrame.pack();
newFrame.setVisible(true);

作为一般的经验法则,我不喜欢将这样的组件直接添加到顶级容器中,我更喜欢使用中间容器,如JPanel,这给了我更多的可能性使用,但那就是我。

你应该只在实际准备就绪时让框架可见,否则你可能会发现有些时候,组件不会出现

有关详细信息,请参阅Laying Out Components Within a Container

答案 2 :(得分:0)

你犯了一些错误。

add(bluePill);

不会做你想要的,即使它会,它仍然是错的。 (听起来很奇怪,但我会解释它)

首先"对"方法:

//Create a new window when "The Matrix" is clicked in the JCB
        JFrame newFrame = new JFrame();        
        newFrame.setSize(300, 200);
        newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);

        bluePill = new JButton("Blue Pill");
        newFrame.getContentPane().add(bluePill);
        redPill = new JButton("Red Pill");
        newFrame.getContentPane().add(redPill);

        newFrame.setVisible(true);

注意我添加了" newFrame",因为您正在调用MultiForm的方法。 这是因为" add()"与" this.add()"相同和"这个"指向MultiForm。如果需要,请使用此行检查:

System.out.println(this.toString());

" getContentPane()"最好用这张图片解释:

JFrame

您将它直接添加到JFrame(我甚至不知道到底发生了什么)。

最好在准备好可见时将框架设置为可见。当你的框架可见时,你的框架没有任何东西。

现在到了JPanel。 JPanel可以容纳一些像JButton等元素。它也可以有一个布局。由于您根本没有使用JPanel,我从您的代码中删除了该行。您仍然可以将JPanel添加到ContentPane并将布局添加到JPanel。 (您还可以将JPanel添加到JPanels以创建复杂的布局)

我希望你能清楚这一点。