所以我一直在寻找这个问题的其他解决方案,但似乎它们都没有任何帮助。有人能帮助我吗?
代码:
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);
}
它只是给我一个完全蓝色的窗口。
答案 0 :(得分:3)
你看到所有的蓝色是因为你要将score1,一个全蓝色的JTextArea添加到JFrame的contentPane,一个使用BorderLayout的容器,这使得JTextArea填充了contentPane,只留下蓝色。没有添加任何其他内容,因为NullPointerException是由您使用填充了null的JButton数组引起的。一旦你修复了这个bug(你从未告诉过我们),你就会看到因为同样的问题而只有红色。
您无疑会阅读的最佳解决方案是使用布局管理器来创建GUI。虽然null
布局和setBounds()
似乎可以像创建复杂GUI的最简单和最好的方式一样使用Swing GUI,但是您创建的Swing GUI越多,在使用它们时就会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕
其他问题:
setVisible(true)
向其添加任何向后的内容。您希望在添加完所有内容后进行此次调用,以便在显示时显示在JFrame中。JTextArea(100, 200);
。你不是创建一个100乘200像素的JTextArea,而是创建100个行乘200 列,这是一个非常巨大的JTextArea。在使用不熟悉的组件时,您需要阅读文档和API。"So I've been looking at other solutions to this problem, but it seems that none of them help at all."
可能“其他解决方案”建议您使用布局管理器,而不是说它们根本没有“帮助”,您应该努力学习如何使用这些工具,因为其他解决方案 正确。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();
}
});
}
}
显示为: