java - 在位置设置按钮和文本区域
java - Setting Buttons and TextAreas at locations
所以我一直在寻找解决这个问题的其他方法,但似乎 none 中的方法完全有用。有人可以帮助我吗?
代码:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Container cont = frame.getContentPane();
JPanel buttonpanel = new JPanel();
JButton[] button = new JButton[12];
JTextArea score1, score2;
score1 = new JTextArea(100, 200);
score2 = new JTextArea(100, 200);
frame.setSize(800, 600);
frame.setVisible(true);
score1.setLayout(null);
score1.setBackground(Color.BLUE);
score2.setLayout(null);
score2.setBackground(Color.RED);
score1.setLocation(0, 100);
score2.setLocation(700, 100);
frame.add(score1);
for (int i = 0; i < button.length / 2; i++) {
button[i].setBounds(100 * (i + 1), 100, 100, 100);
button[i].setBackground(Color.GRAY);
buttonpanel.add(button[i]);
}
frame.add(buttonpanel);
frame.add(score2);
// frame.add(panel);
}
它让我 window 完全忧郁。
您看到全蓝色是因为您要添加 score1,一个全蓝色的 JTextArea 到 JFrame 的 contentPane,一个使用 BorderLayout 的容器,这使得 JTextArea 填充 contentPane,只留下蓝色。没有添加任何其他内容,因为 NullPointerException 是由您使用填充有空值的 JButton 数组引起的。一旦你修复了这个错误(你从未告诉过我们),由于同样的问题,你只会看到红色。
最好的解决方案(您肯定已经读过)是充分利用布局管理器来创建 GUI。虽然 null
布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,使用它们时 运行 遇到的困难就越严重.它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护的,当放置在滚动窗格中时它们会完全失败,当在所有平台或不同的屏幕分辨率上查看时它们看起来很糟糕来自原来的。
其他问题:
- 您在 JFrame 之前调用
setVisible(true)
,然后 添加任何向后的内容。您希望在 添加完所有内容后 进行此调用,以便它在显示时显示在 JFrame 中。
- 您正在设置 JTextArea 的布局,这没有意义,因为您永远不想将它们用作其他组件的容器。
- 同时了解这并没有按照您的想法进行:
JTextArea(100, 200);
。您不是在创建一个 100 x 200 像素的 JTextArea,而是 100 行 x 200 列,这是一个惊人的 巨大的 JTextArea。使用不熟悉的组件时,您需要阅读文档,API。
- 您声明,
"So I've been looking at other solutions to this problem, but it seems that none of them help at all."
"other solutions" 可能建议您使用布局管理器,而不是声明他们不使用 "help at all",您应该努力学习如何使用布局管理器使用这些工具,因为其他解决方案 是 正确的。
- 是的,您正在尝试在尚未创建的 JButton 数组中使用 JButton。理解引用类型的数组,例如 JButton 数组,最初只填充空引用,类似于一盒空鸡蛋。就像在将鸡蛋放入纸箱之前不能使用纸箱中的任何鸡蛋一样,在将 JButton 放入其中之前不能在阵列中使用它们。在遍历数组的 for 循环中,在顶行创建每个 JButton 项:
button[i] = new JButton("Something");
您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info
例如,你告诉我哪个更容易调试,你的代码,还是这段代码:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;
public class Foo2 extends JPanel {
private static final String[] BUTTON_TEXTS = { "A", "B", "C", "D", "E", "F",
"G", "H", "I", "J", "K", "l" };
private static final int GAP = 3;
private JTextArea textArea1 = new JTextArea(20, 30);
private JTextArea textArea2 = new JTextArea(20, 30);
public Foo2() {
JPanel textAreaGrid = new JPanel(new GridLayout(1, 0, GAP, GAP)); // gridlayout 1 row
textAreaGrid.add(new JScrollPane(textArea1));
textAreaGrid.add(new JScrollPane(textArea2));
JPanel buttonPanel = new JPanel(new GridLayout(2, 0, GAP, GAP)); // 2 rows
for (String btnText : BUTTON_TEXTS) {
buttonPanel.add(new JButton(btnText));
}
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
setLayout(new BorderLayout(GAP, GAP)); // main GUI uses border layout
add(textAreaGrid, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private static void createAndShowGui() {
Foo2 mainPanel = new Foo2();
JFrame frame = new JFrame("Foo2");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
显示为:
所以我一直在寻找解决这个问题的其他方法,但似乎 none 中的方法完全有用。有人可以帮助我吗?
代码:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Container cont = frame.getContentPane();
JPanel buttonpanel = new JPanel();
JButton[] button = new JButton[12];
JTextArea score1, score2;
score1 = new JTextArea(100, 200);
score2 = new JTextArea(100, 200);
frame.setSize(800, 600);
frame.setVisible(true);
score1.setLayout(null);
score1.setBackground(Color.BLUE);
score2.setLayout(null);
score2.setBackground(Color.RED);
score1.setLocation(0, 100);
score2.setLocation(700, 100);
frame.add(score1);
for (int i = 0; i < button.length / 2; i++) {
button[i].setBounds(100 * (i + 1), 100, 100, 100);
button[i].setBackground(Color.GRAY);
buttonpanel.add(button[i]);
}
frame.add(buttonpanel);
frame.add(score2);
// frame.add(panel);
}
它让我 window 完全忧郁。
您看到全蓝色是因为您要添加 score1,一个全蓝色的 JTextArea 到 JFrame 的 contentPane,一个使用 BorderLayout 的容器,这使得 JTextArea 填充 contentPane,只留下蓝色。没有添加任何其他内容,因为 NullPointerException 是由您使用填充有空值的 JButton 数组引起的。一旦你修复了这个错误(你从未告诉过我们),由于同样的问题,你只会看到红色。
最好的解决方案(您肯定已经读过)是充分利用布局管理器来创建 GUI。虽然 null
布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,使用它们时 运行 遇到的困难就越严重.它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护的,当放置在滚动窗格中时它们会完全失败,当在所有平台或不同的屏幕分辨率上查看时它们看起来很糟糕来自原来的。
其他问题:
- 您在 JFrame 之前调用
setVisible(true)
,然后 添加任何向后的内容。您希望在 添加完所有内容后 进行此调用,以便它在显示时显示在 JFrame 中。 - 您正在设置 JTextArea 的布局,这没有意义,因为您永远不想将它们用作其他组件的容器。
- 同时了解这并没有按照您的想法进行:
JTextArea(100, 200);
。您不是在创建一个 100 x 200 像素的 JTextArea,而是 100 行 x 200 列,这是一个惊人的 巨大的 JTextArea。使用不熟悉的组件时,您需要阅读文档,API。 - 您声明,
"So I've been looking at other solutions to this problem, but it seems that none of them help at all."
"other solutions" 可能建议您使用布局管理器,而不是声明他们不使用 "help at all",您应该努力学习如何使用布局管理器使用这些工具,因为其他解决方案 是 正确的。 - 是的,您正在尝试在尚未创建的 JButton 数组中使用 JButton。理解引用类型的数组,例如 JButton 数组,最初只填充空引用,类似于一盒空鸡蛋。就像在将鸡蛋放入纸箱之前不能使用纸箱中的任何鸡蛋一样,在将 JButton 放入其中之前不能在阵列中使用它们。在遍历数组的 for 循环中,在顶行创建每个 JButton 项:
button[i] = new JButton("Something");
您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info
例如,你告诉我哪个更容易调试,你的代码,还是这段代码:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;
public class Foo2 extends JPanel {
private static final String[] BUTTON_TEXTS = { "A", "B", "C", "D", "E", "F",
"G", "H", "I", "J", "K", "l" };
private static final int GAP = 3;
private JTextArea textArea1 = new JTextArea(20, 30);
private JTextArea textArea2 = new JTextArea(20, 30);
public Foo2() {
JPanel textAreaGrid = new JPanel(new GridLayout(1, 0, GAP, GAP)); // gridlayout 1 row
textAreaGrid.add(new JScrollPane(textArea1));
textAreaGrid.add(new JScrollPane(textArea2));
JPanel buttonPanel = new JPanel(new GridLayout(2, 0, GAP, GAP)); // 2 rows
for (String btnText : BUTTON_TEXTS) {
buttonPanel.add(new JButton(btnText));
}
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
setLayout(new BorderLayout(GAP, GAP)); // main GUI uses border layout
add(textAreaGrid, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
private static void createAndShowGui() {
Foo2 mainPanel = new Foo2();
JFrame frame = new JFrame("Foo2");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
显示为: