0

これは私のコードです。うまくいくときはうまくいきますが、うまくいかないsetContentPane(panel)ときは。getContentPane().add(panel)

2 番目の方法が機能しないのはなぜですか? (何も表示されません)

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

既存のLayoutcontentpane が原因で、パネルのサイズが正しくなく、表示されません。既存の contentpane と のレイアウトを比較して、違いに注目しJFrameてくださいJPanel

于 2013-11-28T10:54:49.857 に答える
0

チュートリアルから取得:

BorderLayout.LINE_ENDメソッドへの引数の 1 つとして、コンポーネントの場所 (たとえば、) を指定します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 に答える