【发布时间】:2021-04-25 05:46:38
【问题描述】:
我正在制作一个简单的 GUI,它有一个 JTextArea,我可以在其中粘贴一个字符串。当字符串变得太长时,JTextArea 会填满,我可以看到文字低于我为文本区域设置的范围。我想在这个文本区域添加一个垂直滚动条。
public class GUI implements ActionListener {
private static JTextArea fileContents;
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setSize(700, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
panel.setLayout(null);
fileContents = new JTextArea();
fileContents.setBounds(175, 75, 275, 275);
panel.add(fileContents);
JScrollPane sp = new JScrollPane();
sp.add(fileContents, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
panel.add(sp);
进行此设置时出现错误。
Exception in thread "main" java.lang.IllegalArgumentException: illegal component position
at java.desktop/java.awt.Container.addImpl(Container.java:1111)
at java.desktop/java.awt.Container.add(Container.java:489)
at harness.GUI.main(HarnessGUI.java:60)
【问题讨论】:
-
为什么要将文本区域同时添加到面板和滚动窗格中?
-
1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。请注意,不使用布局管理器通常会使滚动窗格停止运行。 2) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 ..
-
.. 3) 见What is a stack trace, and how can I use it to debug my application errors?。如果您了解堆栈跟踪的工作原理,您会意识到末尾的数字表示源代码中的行号。代码 sn-p 会更改行号,这意味着我们无法充分利用它们。 4)@daniu 提出了一个很好的观点。不要将组件单独添加到滚动窗格和 GUI。任何 GUI 组件/容器都可以只有一个父级。它应该是滚动窗格。此外,不要向滚动窗格添加内容,而是向其视口添加内容。
-
见:How to Use Text Fields。
TextDemo是一个带有 JTextField 和 JTextArea 的工作示例。 -
您得到
IllegalArgumentException,因为您的代码的以下行没有按照您的想法执行:sp.add(fileContents, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);请参阅add(Component,int) 类中的方法java.awt.Container
标签: java swing user-interface jtextarea