Java 如何让 JLabel 展开
Java how to get JLabels to spread out
在我下面的代码中,生成的输出将 JLabel 的每一行都挤在中间。我希望他们散布开来。 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?
提前感谢您的帮助。
How do I get java to display the JLabels separately and evenly across the screen?
您应该只使用带有 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",所以每个实例共享相同的变量。这意味着两个框架将共享相同的面板和标签,这不是您想要的(也是不可能的,因为组件只能有一个父级)。您可能希望框架的每个实例都有自己的组件。
static
关键字只能用于数据不唯一且不会更改的变量。例如,在您的 class 中,您可以使用:
private static String consonants = "BCDFGHJKLMNPQRSTVWXYZ";
因为这只是一个文字字符串,可以被 GUI_with_2D_Arrays
class.
的任何实例使用
在我下面的代码中,生成的输出将 JLabel 的每一行都挤在中间。我希望他们散布开来。 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?
提前感谢您的帮助。
How do I get java to display the JLabels separately and evenly across the screen?
您应该只使用带有 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",所以每个实例共享相同的变量。这意味着两个框架将共享相同的面板和标签,这不是您想要的(也是不可能的,因为组件只能有一个父级)。您可能希望框架的每个实例都有自己的组件。
static
关键字只能用于数据不唯一且不会更改的变量。例如,在您的 class 中,您可以使用:
private static String consonants = "BCDFGHJKLMNPQRSTVWXYZ";
因为这只是一个文字字符串,可以被 GUI_with_2D_Arrays
class.