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