【问题标题】:setContentPane() works but getContentPane().add() doesn't worksetContentPane() 有效,但 getContentPane().add() 无效
【发布时间】:2013-11-28 10:50:05
【问题描述】:

这是我的代码。当我setContentPane(panel) 时它可以工作,但是当我getContentPane().add(panel) 它不起作用。

为什么第二种方法不起作用? (它没有显示任何东西)

public MyFrame() {

    final JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setFont(new Font("Comic Sans MS", Font.BOLD, 12));

    JMenuBar mnuBar = new JMenuBar();

    JMenu mnu1 = new JMenu("aaa");
    mnu1.setMnemonic(KeyEvent.VK_E);

    JMenuItem menuItem = new JMenuItem("Insert Places", KeyEvent.VK_T);
    menuItem.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {

            count = 0;
            jt = new ArrayList[4];
            for (int i = 0; i < 4; i++)
                jt[i] = new ArrayList<JTextField>();

            panel = new JPanel();
            panel.setLocation(0, 0);
            panel.setSize(d.width, d.height);
            panel.setLayout(null);


            JButton add = new JButton("lllll");
            add.setSize(120, 80);
            add.setLocation(250, 100);

            add.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {

                    for (int i = 0; i < 4; i++) {
                        JTextField jt1 = new JTextField(20);
                        jt1.setSize(150, 30);
                        jt1.setLocation(450 + i * 200, 80 + count * 50);
                        jt1.setVisible(true);
                        jt[i].add(jt1);
                        panel.add(jt1);
                    }
                    count++;

                    frame.repaint();

                }
            });
            panel.add(add);

            JButton confirm = new JButton("ccc");
            confirm.setSize(120, 80);
            confirm.setLocation(250, 200);

            confirm.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {

                    count = 0;
                    for (int j = 0; j < jt[0].size(); j++) {
                        try {

                            connect.insertPlace(Integer.parseInt(jt[0]
                                .get(j).getText()), jt[1].get(j).getText(),
                                Integer.parseInt(jt[2].get(j).getText()),
                                Integer.parseInt(jt[3].get(j).getText()));
                            count++;
                        } catch (Exception e) {
                            JOptionPane.showMessageDialog(null, e, "ERROR",
                                0, null);
                        }
                    }

                    JLabel countL = new JLabel("" + count
                        + "    ??? ??? ??     ");
                    countL.setSize(100, 100);
                    countL.setLocation(250, 350 + jt.length * 10);
                    panel.add(countL);
                    frame.repaint();

                }
            });
            panel.add(confirm);
            frame.getContentPane().add(panel);

        }
    });
    mnu1.add(menuItem);
    mnuBar.add(mnu1);
    frame.setJMenuBar(mnuBar);
    frame.pack();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);
}

【问题讨论】:

    标签: java swing frame layout-manager contentpane


    【解决方案1】:

    现有内容窗格的Layout 是这样的,即您的面板尺寸不正确且无法显示。比较现有内容窗格的布局,JFrame 和您的JPanel 并注意差异。

    【讨论】:

    • 我想在我的面板中随意放置按钮。我应该使用什么布局?
    • “我想在面板中任意放置按钮” 使用ArbitraryLayout。好吧不,开玩笑的。但是每个 布局背后都有某种形式的逻辑,并且该逻辑应该表达为 1) J2SE 布局管理器之一。 2) 自定义布局管理器,或 3) 布局管理器的组合。 ——所以哈!我的ArbitraryLayout 现在听起来不那么傻了,是吗?
    • 确实,您应该决定如何布局按钮和面板,然后使用不同布局管理器的组合来实现。
    【解决方案2】:

    取自the tutorials

    将组件的位置(例如,BorderLayout.LINE_END)指定为add 方法的参数之一。如果由BorderLayout 对象控制的容器中缺少此组件,请确保指定了组件的位置,并且没有将其他组件放置在同一位置。

    据我所知,你有

    frame.setLayout(new BorderLayout());
    

    但是,你没有指定它的位置。

    frame.getContentPane().add(panel);
    

    试试吧,

    frame.getContentPane().add(panel, BorderLayout.CENTER);
    

    另外,我不确定以下操作的顺序是否相关

    panel = new JPanel();
    panel.setLocation(0, 0);
    panel.setSize(d.width, d.height);
    panel.setLayout(null);
    

    但你可以直接在构造函数上设置布局。

    panel = new JPanel(null);
    

    而且,由于您的面板将插入到由布局管理器控制的容器中,因此您无需指定其位置。至于它的尺寸,您可以指定它的首选尺寸,尽管这被某些人认为不是一个好的做法。

    panel.setPreferredSize(new Dimension(d.width, d.height));
    

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2012-05-03
      • 2011-08-20
      • 2017-01-08
      • 2012-05-08
      • 2017-03-15
      • 2014-10-30
      • 2011-03-08
      • 2013-11-27
      相关资源
      最近更新 更多