Вы видите все синие цвета, потому что вы добавляете score1, все синие JTextArea в контентную панель JFrame, контейнер, который использует BorderLayout, и это заставляет JTextArea заполнять contentPane, не оставляя ничего, кроме синего. Ничего еще не добавлено, поскольку исключение NullPointerException, вызванное использованием массива JButton, заполненным нулями. Как только вы исправите эту ошибку (о которой вы никогда не говорили), вы не увидите ничего, кроме красного, из-за той же проблемы.
Лучшее решение, о котором вы, несомненно, читали, - это использование менеджеров компоновки с максимальным преимуществом для создания вашего графического интерфейса. Хотя макеты null
и setBounds()
могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного ,
Другие проблемы:
- Вы звоните
setVisible(true)
на вашем JFrame перед тем добавляя что-нибудь к нему, которое в обратном направлении. Вы хотите сделать этот звонок после, все было добавлено, чтобы оно отображалось в JFrame, когда оно отображается.
- Вы устанавливаете компоновку JTextArea, которая не имеет смысла, поскольку вы никогда не захотите использовать их в качестве контейнеров для других компонентов.
- Также поймите, что это не делает то, что вы думаете, что это делает:
JTextArea(100, 200);
. Вы не создаете JTextArea, размер которой составляет 100 на 200 пикселей, а составляет 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."
Возможно, «другие решения» рекомендовали использовать диспетчеров макетов, а не заявлять, что они вообще не помогают, вам следует попытаться научиться использовать эти инструменты, поскольку эти другие решения - правильно.
- И да, вы пытаетесь использовать JButtons в массиве JButton, которые еще не созданы. Поймите, что массив ссылочного типа, такой как массив JButton, изначально заполнен только нулевыми ссылками, похожими на пустую коробку с яйцами. Так же, как вы не можете использовать какие-либо яйца из коробки, пока вы не поместите туда яйца, вы не сможете использовать JButtons в своем массиве, прежде чем вы разместите их там.В течение цикла, где вы итерации через массив, создать каждый элемент JButton в верхней строке:
button[i] = new JButton("Something");
Вы можете найти ссылки на 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();
}
});
}
}
который показывает, как:
![enter image description here](https://i.stack.imgur.com/nnCAx.jpg)
Кроме того, если вы пытаетесь настроить графический интерфейс, покажите изображение, которое показывает, чего вы пытаетесь достичь. В 99% случаев лучшее решение - это не то, как вы это делаете. Не используйте абсолютное позиционирование, потому что это ужасный способ сделать GUI 99% времени. –
Хотя пустые макеты и 'setBounds()' могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного , –