Java GUI、JComboBox和打开新窗口

Java GUI、JComboBox和打开新窗口,java,swing,jframe,actionlistener,Java,Swing,Jframe,Actionlistener,我是Java新手,尤其是GUI新手,现在我对它非常困惑 我正在为类制作一个程序,该类应该有一个菜单(我假设是JComboBox),当选择一个选项时,它会打开一个新窗口。我正在做第一个选项,点击“矩阵”,弹出一个新窗口,其中有两个按钮,分别是“红色药丸”和“蓝色药丸”,这就是我碰壁的地方 我已经能够创建一个新窗口(不确定这是否是打开新窗口的正确方法),但是,当我尝试向新弹出窗口添加按钮时,没有显示任何内容… 感谢您的帮助或正确方向的指点 public class MultiForm extends

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

我正在为类制作一个程序,该类应该有一个菜单(我假设是JComboBox),当选择一个选项时,它会打开一个新窗口。我正在做第一个选项,点击“矩阵”,弹出一个新窗口,其中有两个按钮,分别是“红色药丸”和“蓝色药丸”,这就是我碰壁的地方

我已经能够创建一个新窗口(不确定这是否是打开新窗口的正确方法),但是,当我尝试向新弹出窗口添加按钮时,没有显示任何内容…

感谢您的帮助或正确方向的指点

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);
}
}

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

您必须首先实际使用
getContentPane()
,因为您没有将任何组件添加到
JFrame
本身,而是添加到中间的“面板”

您必须将
布局
添加到
JPanel
或/和
JFrame
中,并调整组件的大小,但这样做的路径是正确的


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

您犯了一些错误

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()”相同,“this”指向多种形式。如果您想要:

System.out.println(this.toString());
“getContentPane()”最好用以下图像来解释:

您直接将其添加到JFrame(我甚至不知道接下来会发生什么)

当框架准备可见时,将其设置为可见也是一种很好的做法。当您使框架可见时,它不包含任何内容

现在请看JPanel。JPanel可以保存一些元素,如JButton等,还可以具有布局。因为您根本没有使用JPanel,所以我从代码中删除了这一行。您仍然可以将JPanel添加到ContentPane,并向JPanel添加布局。(您还可以将JPanels添加到JPanels以创建复杂的布局)

我希望这对你来说是清楚的

我试着做newFrame.add(BluePill),它创建了一个与整个窗口大小相同的按钮,不允许我以这种方式添加两个按钮

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

有关更多详细信息,请参阅

所以我觉得这不是正确的方法

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

在这个小例子中,我只使用了一个
流程布局
,但是你可以使用任何能给你想要的效果的东西

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
,这给了我更多的重复使用的可能性,但这就是我

您还应该仅在框架实际准备就绪时使其可见,否则您可能会发现有时组件不会显示


有关更多详细信息,请参见

是否尝试将按钮添加到新框架?因为您没有执行
newFrame.add(…)
。您不需要额外的面板,因为JFrame有自己的面板(称为内容窗格)。添加组件后,还应设置为可见。您可以在添加组件后调用
frame.pack()
,而不是手动调整框架的大小,它将调整框架的大小以适合组件。是的,很抱歉,我正在尝试将其添加到新框架中。老实说,我尝试过使用newFrame.add(BluePill),它创建了一个与整个窗口大小相同的按钮,不允许我以这种方式同时添加两个按钮,因此我认为这不是正确的方式。“我尝试过使用newFrame.add(BluePill)。”它创建了一个与整个窗口大小相同的按钮,它不允许我以这种方式添加两个按钮”-这是因为框架默认使用
边框布局
,“因此我认为这不是正确的方式”-这是正确的方法,您只需要使用一个布局管理器,它可以容纳更多的组件或更改添加按钮的位置。明白了!这可能是一个愚蠢的问题,但是什么是getContentPane?为什么我需要添加(面板)?最后一个问题要将新窗口添加到第二个选项,我可以通过创建新框架来做同样的事情,对吗?然后我可以做一个条件if(event.getSource()=“The Matrix”),然后在该条件中添加上面的所有内容吗?如果这样做有效的话,那就是正确的路径了?@user3862586好吧,使用JFrame,您不使用add,而是使用getContentPane().add方法,因为您不是添加到框架中,而是添加到框架上的中间窗格。@user3862586我会使用,例如,MatrixListener并实现ActionListener接口,这样我就可以确保只有Matrix使用它,而不是其他任何东西。PS:别忘了接受答案:)事实上,您不必“必须”使用
getContentPane
,从Java 1.5开始,您只需使用
add
(在
JFrame
上),它将自动委托给
contentPane
)是的,那清除了一吨!!该死的伙计们,你们都回答了我的问题,我应该为谁点击复选标记???什么是更好的方式做这件事…你说的天网是newFrame.getContentPane().add(bluePill);你呢
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);