java - 如何将不断变化的 JTextArea 放到 JScrollPane 中?

标签 java swing

我有这样的代码。我删掉了所有的细节,但是这个文本区域会在按下按钮后发生变化,而它所做的只是改变了文本区域。没有添加滚动。我什至尝试将滚动策略设置为始终,但它返回错误。此面板将添加到另一个带有 BorderLayout.CENTER 的面板,然后该面板将添加到 JFrame。

public class Tester extends JFrame{
    JPanel panel = new JPanel(); 
    public static void main(String[] args) {
        new Tester();
    }
    public Tester(){
        setSize(1300, 700);
        setTitle("A Bar Chart");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel();
        setVisible(true);
    }
    public void panel(){
        JTextArea text = new JTextArea();
        text.setPreferredSize(new Dimension(100, 100));
        JScrollPane pane = new JScrollPane(text);
        JButton button = new JButton("a");
        button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
          text.setText("asd\nasdasd\nasdasd\nasdasd\nasdasd\nasdasd\na\na\na\n");

        }
      });
        panel.add(pane);
        panel.add(button);
        add(panel);
    }
}

我想现在我只是去简化它。也许问题是当我设置文本时,大小没有改变,所以滚动没有出现。所以也许现在的问题是如何使滚动条出现或更改它的大小以便滚动条出现。

最佳答案

你搬起石头砸自己的脚:

text.setPreferredSize(new Dimension(100, 100));

切勿以这种方式限制 JTextArea 的大小,因为它会导致您看到的问题,因为通过限制首选大小,当 JTextArea 的文本占用的空间超过首选大小所允许的空间时,JTextArea 将无法适当扩展。而是设置 JTextArea 的列和行属性,使用适当的构造函数最容易做到。

JTextArea text = new JTextArea(TEXT_AREA_ROWS, TEXT_AREA_COLUMNS);

例如,

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class Tester2 extends JPanel {
    private static final int TA_ROWS = 30;
    private static final int TA_COLS = 50;
    private JTextArea text = new JTextArea(TA_ROWS, TA_COLS);

    public Tester2() {
        text.setFocusable(false);
        JScrollPane scrollPane = new JScrollPane(text);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new ButtonAction("Press Me")));

        setLayout(new BorderLayout());
        add(scrollPane);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private class ButtonAction extends AbstractAction {
        public ButtonAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 80; i++) {
                int wordsInSent = (int) (5 + 6 * Math.random()); 
                for (int j = 0; j < wordsInSent; j++) {
                    int wordLength = (int) (5 + 8 * Math.random());
                    for (int k = 0; k < wordLength; k++) {
                        char c = (char) ('a' + (int)(Math.random() * ('z' - 'a')));
                        sb.append(c);
                    }
                    sb.append(" ");
                }
                sb.append("\n");
            }
            text.append(sb.toString());
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Tester2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new Tester2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

关于java - 如何将不断变化的 JTextArea 放到 JScrollPane 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40619911/

相关文章:

java - 数据库连接失败时如何重定向到错误页面?

java - 为什么这个对象为空?

java - 谁负责设置对象属性?

java - 为什么不显示带有单选按钮的第二个面板?

java - 如何不断更新按钮颜色 [JAVA SWING]

java - 将 swing 组件绘制到图形

java - Spring 数据 MongoDB : how to partially map domain object to MongoDB?

java - 如果可以通过任何其他方法访问对象,那么在同步块(synchronized block)中锁定对象有什么用呢?

Java 等待线程完成

java - 为什么使用 Gui 输入和监听器方法会出现 Null 指针异常?