[英]How can I add ScrollBar to JTextArea in Java Swing?
任何人都可以帮助我如何在 Java 中使用 Swing 向JTextArea
添加滚动条?
当我在其上添加滚动条时, JTextArea
消失。
希望有人让我在上面添加一个垂直滚动条。
额外的解释将非常感谢
public class Practice extends JFrame {
JFrame frame = new JFrame("AAA");
JTextArea textarea = new JTextArea();
JScrollPane scroll = new JScrollPane(textarea);
JPanel panelForScroll = new JPanel(null);
public Practice(){
frame.setLayout(null);
frame.setBounds(100,100,400,710);
frame.setResizable(false);
frame.setVisible(true);
textarea.setEditable(false);
textarea.setFont(new Font("arian", Font.BOLD, 16));
textarea.setBounds(20, 280, 340, 70);
panelForScroll.add(scroll);
frame.add(panelForScroll); //can't find text area....
}
public static void main(String[] args) {
new Practice();
}
}
您的代码中有几个错误:
您使用的是null
布局,这是不鼓励的,因为它会产生比解决方案更多的问题,特别是当您尝试使用JScrollPanes
,因为它们采用Component
的preferredSize
来决定是否添加滚动条。 请参阅为什么不赞成在 Swing 中使用空布局? 有关这方面的更多信息。 要解决此问题,请删除此行:
frame.setLayout(null);
而是使用布局管理器或它们的组合以及边框来增加组件之间的间距。
虽然null
布局似乎是为 Swing 新手设计复杂 GUI 的最佳、最简单和更快的方法,但您在其中取得的进展越多,您会发现与使用它们相关的问题越多(实际情况就是如此)
您正在从JFrame
扩展您的类,并且您也在其中创建JFrame
一个实例,请使用其中一个。 当您扩展JFrame
您是说您的类是一个JFrame
,因此它不能放置在另一个Container
因为JFrame
是一个刚性容器。 我建议忘记extends JFrame
部分,因为无论如何您都没有使用此操作生成的JFrame
并保留您创建的对象。 有关此问题的更详细答案,请参阅https://stackoverflow.com/questions/41252329/java-swing-using-extends-jframe-vs-calling-it-inside-of-class 。
您在添加所有元素之前使 GUI 可见,这可能会导致您的 GUI 不显示所有元素,直到您将鼠标悬停在它们上面,这一行:
frame.setVisible(true);
应该是程序中的最后一行之一
您没有将程序放在事件调度线程 (EDT) 上,这会使您的应用程序不是线程安全的,您可以通过在main
方法上编写它来修复它。
SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Place your constructor here } });
您正在为textArea
而不是为scrollPane
设置边界,但您真的不应该手动设置边界(再次参见第 1 点)。
现在,您可以使用JTextArea
和JScrollPane
制作一个简单的 GUI,如下所示:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class ScrollPaneToTextArea {
private JTextArea textArea;
private JFrame frame;
private JScrollPane scroll;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ScrollPaneToTextArea().createAndShowGui();
}
});
}
public void createAndShowGui() {
frame = new JFrame("ScrollPane to TextArea");
textArea = new JTextArea(10, 20); //Rows and cols to be displayed
scroll = new JScrollPane(textArea);
// scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
frame.add(scroll); //We add the scroll, since the scroll already contains the textArea
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
产生此输出并在需要时添加滚动条(即当文本比它可以在视图中处理的行更远时)
如果您希望始终显示垂直滚动条,您可以取消注释该行:
scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
这将产生以下输出:
JPanel panelForScroll = new JPanel(null);
这将NULL 布局设置为此 JPanel。 这将需要更多配置(就像您对框架对象所做的那样)。
只需删除null
(也从frame.setLayout(null)
!)
您必须使用 Jtextpane 来获取 textarea 上的滚动条。
JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta);
JFrame f = new JFrame();
f.getContentPane().add(sp);
您将面板的布局设置为 null,然后您没有指定滚动条边界。 由于您的面板中只有一个组件,即滚动条,我建议您使用 FlowLayout
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.