Java 如何将正在更改的JTextArea放入JScrollPane?

Java 如何将正在更改的JTextArea放入JScrollPane?,java,swing,Java,Swing,我有这样的代码。我删掉了所有的细节,但是这个文本区域在按下一个按钮后会改变,它所做的只是改变了文本区域。没有添加滚动。我甚至尝试将滚动策略设置为“始终”,但它返回一个错误。此面板将添加到另一个具有BorderLayout.CENTER的面板,然后该面板将添加到JFrame public class Tester extends JFrame{ JPanel panel = new JPanel(); public static void main(String[] args)

我有这样的代码。我删掉了所有的细节,但是这个文本区域在按下一个按钮后会改变,它所做的只是改变了文本区域。没有添加滚动。我甚至尝试将滚动策略设置为“始终”,但它返回一个错误。此面板将添加到另一个具有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的columns和rows属性,这是使用适当的构造函数最容易做到的

JTextArea text = new JTextArea(TEXT_AREA_ROWS, TEXT_AREA_COLUMNS);
e、 g

导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
公共类Tester2扩展了JPanel{
专用静态最终int TA_行=30;
私有静态最终整数=50;
私有JTextArea text=新JTextArea(TA_行,TA_列);
公共测试员2(){
text.setFocusable(false);
JScrollPane scrollPane=新的JScrollPane(文本);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS);
JPanel buttonPanel=新的JPanel();
添加(新按钮(新按钮操作(“按我”));
setLayout(新的BorderLayout());
添加(滚动窗格);
添加(按钮面板,边框布局。页面\结尾);
}
私有类按钮操作扩展了AbstractAction{
公共按钮操作(字符串名称){
超级(姓名);
}
@凌驾
已执行的公共无效操作(操作事件e){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<80;i++){
int wordsInSent=(int)(5+6*Math.random());
对于(int j=0;jcreateAndShowGui());
}
}

您可以使用
设置垂直滚动条策略(int)
设置水平滚动条策略(int)
在JScrollPane上设置滚动条策略。这些选项是根据需要、垂直和始终设置的

JavaDocs提供了有关如何使用的更多信息:


我删减了所有细节
-是的,在问题解决之前,你不知道哪些细节是相关的。张贴一个适当的说明问题的帖子。这是一个带有滚动窗格、文本区域和向文本区域添加数据的按钮的框架。只有当文本区域的首选大小大于滚动窗格的大小时,才会发生滚动<代码>此面板将添加到另一个具有边框布局的面板。居中-不需要此面板。只需将滚动窗格直接添加到框架中即可。确定。我设法用更简单的代码来模拟这个问题。@tobias_k:是的,你错了。是的,它能工作。出于某些原因,我认为我尝试了这个方法,但它不起作用,但可能是我做了其他错误的事情。不管怎样,谢谢。@Tienahnguyen:请参见编辑文本区域中随机词的示例
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());
    }
}