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