0

これが私のプログラムです。このプログラムは、Javaでswingsを使用してフレームを作成し、最初にグリッドを作成して、そのフレームにボタンを追加するだけです:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class one {
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(400,400);
        frame.getContentPane().setPreferredSize(new Dimension(500,500));
        frame.pack();
        frame.setVisible(true);
        Container pane=frame.getContentPane();
        pane.setLayout(new GridLayout(5,6));

        JButton[] buttons = new JButton[26];

        String  b[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        for(int i = 0; i<buttons.length; i++) {
            buttons[i] = new JButton(b[i]);
            buttons[i].setSize(80, 80);
            buttons[i].setActionCommand(b[i]);
            buttons[i].addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    String choice = e.getActionCommand();
                    JOptionPane.showMessageDialog(null, "You have clicked: "+choice);
                }
            });
            System.out.println("adding button\n");
            pane.add(buttons[i]);
        }

    }
    public static void main(final String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

プログラムは正常にコンパイルされますが、ボタンの作成では、「A」のボタンが 1 つしか表示されず、残りのボタンはペインに表示されません。

4

3 に答える 3

4

これは他の人にも有効であるため、競合状態やシステムに依存するタイプの問題のようです。いずれにせよ、java.awt.Container.add()のJavadocは次のように述べています。

このメソッドは、レイアウト関連の情報を変更するため、コンポーネント階層を無効にします。コンテナがすでに表示されている場合は、追加されたコンポーネントを表示するために、後で階層を検証する必要があります。

したがって、すべてのコンポーネントを追加した後、pane.validate()を呼び出す必要があります(または、MadProgrammerが言うように、すべてのコンポーネントを追加した後にsetVisible()呼び出しを実行します)。

于 2012-10-18T08:11:39.807 に答える
3

この問題を解決するには、基本的に 2 つの方法があります。

frame.setVisible(true)1 つ目は、へのボタンの追加が完了した後の呼び出しですpane

2つ目は、電話することです

pane.invalidate();
pane.repaint();

すべてのボタンをpane

于 2012-10-18T08:04:01.393 に答える
0

ボタン(AZ)が見えます。問題を再現できませんでした。 ここに画像の説明を入力

于 2012-10-18T08:13:10.630 に答える