setContentPane()有效但getContentPane()。add()不起作用

时间:2013-11-28 10:50:05

标签: java swing frame layout-manager contentpane

这是我的代码。当我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);
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

取自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));