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