【问题标题】:Java how to get JLabels to spread outJava如何让JLabels散开
【发布时间】:2018-09-25 09:51:54
【问题描述】:

在我下面的代码中,结果输出中的每一行 JLabels 在中心被挤压在一起。我希望他们分散开来。 main 方法只是创建了一个 GUI 实例,并且所有必要的包都已导入。

// Main class with JFrame and ActionListener enabled
public class GUI_with_2D_Arrays extends JFrame {

    // Class variables
    private static JLabel[][] labels = new JLabel[6][6];
    private static JPanel[][] panels = new JPanel[6][6];
    private static char[][] letters = new char[6][6];
    private static Random random = new Random();

    // Constructor
    public GUI_with_2D_Arrays() {

        // Initialize panels
        for (JPanel[] row : panels)
            Arrays.fill(row, new JPanel());

        // Initialize chars with randomly generated letters
        String consonants = "BCDFGHJKLMNPQRSTVWXYZ", vowels = "AEIOU";
        int index;
        for (int i = 0; i < 5; i++)
            for (int j = 0; j < 5; j++) {
                index = random.nextInt(consonants.length());
                letters[i][j] = consonants.charAt(index);
            }
        for (int i = 0; i < 6; i++) {
            index = random.nextInt(vowels.length());
            letters[i][5] = vowels.charAt(index);
            letters[5][i] = vowels.charAt(index);
        }
        shuffle(letters);

        /*
         * Assign chars to labels, sets font of labels, adds labels to panels, sets
         * layout of panels and adds panels to frame
         */
        for (int i = 0; i < labels.length; i++) {
            for (int j = 0; j < labels[i].length; j++) {
                labels[i][j] = new JLabel(Character.toString(letters[i][j]));
                labels[i][j].setFont(new Font("Comic Sans MS", Font.PLAIN, 30));
                panels[i][j].setLayout(new FlowLayout());
                panels[i][j].add(labels[i][j]);
                getContentPane().add(panels[i][j]);
            }
        }

        setSize(840, 840);
        setLayout(new GridLayout(6, 6));
        setLocationRelativeTo(null);
        setVisible(true);

    }

}

如何让 java 在屏幕上分别均匀地显示 JLabel?

提前感谢您的帮助。

【问题讨论】:

    标签: java swing user-interface awt jlabel


    【解决方案1】:

    如何让 java 在屏幕上分别均匀地显示 JLabel?

    您应该只使用带有GridLayout 的单个面板。然后,您应该将标签直接添加到此面板。所以基本逻辑是:

    JPanel labelPanel = new JPanel( new GridLayout(0, 5) );
    
    for (int i = 0; i < labels.length; i++) {
        for (int j = 0; j < labels[i].length; j++) {
            JLabel label = new JLabel(Character.toString(letters[i][j]));
            label.setFont(new Font("Comic Sans MS", Font.PLAIN, 30));
            labelPanel.add( label );
        }
    }
    
    add(labelPanel. BorderLayout.CENTER);
    

    另外,去掉所有变量上的 static 关键字。你不应该使用它。

    如果你有这样的代码:

    JFrame one = new GUI_with_2D_Arrays(); 
    JFrame two = new GUI_with_2D_Arrays(); 
    

    您有两个 JFrame 实例。但是,由于变量是“静态的”,每个实例共享相同的变量。这意味着两个框架将共享相同的面板和标签,这不是您想要的(而且也不可能,因为组件只能有一个父级)。您会希望框架的每个实例都有自己的组件。

    static 关键字只能用于数据不唯一且不会更改的变量。例如,在您的课堂上,您可以使用:

    private static String consonants = "BCDFGHJKLMNPQRSTVWXYZ";
    

    因为这只是一个可以被GUI_with_2D_Arrays 类的任何实例使用的文字字符串。

    【讨论】:

    • Those variables should be instances of your class. 这是什么意思?感谢您的回答,它奏效了。:)
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多