繁体   English   中英

GUI,JComboBox并打开一个新窗口

[英]GUI, JComboBox and opening a new window

我是Java的新手,尤其是GUI的新手,这对我而言现在超级困惑。

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

我到了可以创建新窗口的地步(不确定这是否是打开新窗口的正确方法),但是,当我尝试将Buttons添加到新的弹出窗口时,什么都没有显示。 ..

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

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

您没有使用新JFramegetContentPane()方法。

您实际上必须首先使用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并使用组件的大小,但是使用此Layout您的路径正确。

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

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

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

有关更多详细信息,请参见如何使用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 ,这给了我更多的重用可能性,但这就是我。

您还应该仅在框架准备就绪时才使框架可见,否则您可能会发现某些时候组件不会显示

有关更多详细信息,请参见在容器中布置组件

你犯了一些错误。

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”指向MultiForm。 如果需要,请在此行中进行检查:

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

最好使用以下图像说明“ getContentPane()”:

框架

您将其直接添加到JFrame中(我什至不知道那时到底会发生什么)。

在准备好可见的框架时,最好将其设置为可见。 使框架可见时,框架不包含任何内容。

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

希望对您来说清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM