【问题标题】:Adding a vertical scroll bar to a JTextArea向 JTextArea 添加垂直滚动条
【发布时间】: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 exampleShort, 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 FieldsTextDemo 是一个带有 JTextField 和 JTextArea 的工作示例。
  • 您得到IllegalArgumentException,因为您的代码的以下行没有按照您的想法执行:sp.add(fileContents, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 请参阅add(Component,int) 类中的方法java.awt.Container

标签: java swing user-interface jtextarea


【解决方案1】:

此代码有效:

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        frame.setSize(700, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setVisible(true);
        panel.setLayout(null);

        fileContents = new JTextArea();
        JScrollPane sp = new JScrollPane(fileContents);
        sp.setBounds(175, 75, 300, 300);
        panel.add(sp);

您有 2 个问题:

  1. 如果将fileContents 添加到sp 并添加到panel,则无需将fileContents 添加到panel
  2. 使用JScrollPane 时,应仅使用构造函数JScrollPane(Component view) 而非add() 方法添加Components。

【讨论】:

  • 您也可以在JScrollPane构造函数中提供VERTICAL_SCROLLBAR_ALWAYS策略。像这样JScrollPane sp = new JScrollPane(fileContents, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多