我是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);
}
}
答案 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(我甚至不知道到底发生了什么)。
最好在准备好可见时将框架设置为可见。当你的框架可见时,你的框架没有任何东西。
现在到了JPanel。 JPanel可以容纳一些像JButton等元素。它也可以有一个布局。由于您根本没有使用JPanel,我从您的代码中删除了该行。您仍然可以将JPanel添加到ContentPane并将布局添加到JPanel。 (您还可以将JPanel添加到JPanels以创建复杂的布局)
我希望你能清楚这一点。