Привет, я новичок в Java Swing и решил создать текстовый редактор:
import java.awt.FlowLayout;
import javax.swing.*;
public class main {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500, 500);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new FlowLayout());
JTextArea textArea = new JTextArea();
JScrollPane scrollableTextArea = new JScrollPane(textArea);
scrollableTextArea.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollableTextArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
f.pack()
f.getContentPane().add(scrollableTextArea);
}
}
но JTextArea не изменяет размер окна
Я попытался получить размер окна и изменить размер JTextArea по размеру окна (я потерял код)
Пожалуйста помоги!
Я предлагаю еще раз взглянуть на менеджеры макетов и на то, как они работают. Официальное руководство — хорошее место для начала: docs.oracle.com/javase/tutorial/uiswing/layout/index.html
Зачем ты вообще добавил строчку f.getContentPane().setLayout(new FlowLayout());
? Он конкретно просит о поведении, которого вы не хотите. Кроме того, нет смысла делать f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
дважды. И, как уже было сказано, pack()
должно появиться после того, как вы добавили компоненты. И f.setVisible(true);
должно прийти даже после этого; это должно быть последнее, что нужно сделать. А поскольку pack()
определит правильный размер окна, оператор f.setSize(500, 500);
не нужен.
Почему вы используете ScrollPane, если хотите, чтобы размер текстовой области изменялся вместе с окном?
@matt Почему вы используете ScrollPane, если хотите, чтобы размер текстовой области изменялся вместе с окном? -если у вас есть сотня строк текста, вы все равно хотите иметь возможность видеть всю строку текста (путем прокрутки), если весь текст не помещается в пространство, доступное для окна. По этой причине JTextArea и JTextPane почти всегда добавляются в панель прокрутки.
Когда вы создаете JTextArea, вам следует использовать код типа new JTextArea(10, 40)
, чтобы указать строки/столбцы по умолчанию для текстовой области, чтобы при «упаковке» фрейма текстовая область могла отображаться с разумным размером.
У Oracle есть полезное руководство Создание графического интерфейса с помощью Swing . Пропустите раздел «Обучение с использованием среды IDE NetBeans». Особое внимание обратите на раздел Размещение компонентов в контейнере.
Изучите остальную часть урока позже.
Вот графический интерфейс, который иллюстрирует JTextArea
, который меняет размер, когда JFrame
меняет размер. Я использовал менеджеры компоновки Swing.
Все приложения Swing должны начинаться с вызова метода SwingUtilities
invokeLater
. Этот метод гарантирует, что компоненты Swing создаются и выполняются в потоке диспетчеризации событий .
У JFrame
есть значение по умолчанию BorderLayout
. Я использовал BorderLayout
вместо JPanel
.
Выработайте привычку размещать компоненты Swing в JPanel
.
Используйте гораздо более описательные имена полей. Используйте несколько методов и классов. Это облегчает чтение и понимание кода другими людьми.
Вот полный работоспособный код.
import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class JTextAreaExample2 implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new JTextAreaExample2());
}
@Override
public void run() {
JFrame frame = new JFrame("JTextArea Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createTextAreaPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createTextAreaPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JTextArea textArea = new JTextArea(20, 60);
JScrollPane scrollPane = new JScrollPane(textArea);
panel.add(scrollPane, BorderLayout.CENTER);
return panel;
}
}
Вам нужно посмотреть, как работают менеджеры по расположению. Удалить f.getContentPane().setLayout(new FlowLayout()); Звоните
pack()
после того, как выложите компоненты