0

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

2 回答 2

2

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

于 2013-11-28T10:54:49.857 回答
0

取自教程

将组件的位置(例如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));
于 2013-11-28T11:07:45.230 回答