如何在Java Swing中将ScrollBar添加到JTextArea?

时间:2017-01-20 16:54:16

标签: java swing scrollbar jscrollpane jtextarea

任何人都可以帮助我如何使用Swing in Java将滚动条添加到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();
    }
}

4 个答案:

答案 0 :(得分:6)

您的代码中存在多个错误:

  1. 您使用的是null版面,因此它不会产生比解决方案更多的问题,特别是当您尝试使用JScrollPanes时,因为它们会使用preferredSize Component决定是否添加滚动条。有关详细信息,请参阅Null layout is evilWhy is it frowned upon to use a null layout in Swing?。要解决此问题,请删除以下行:

    frame.setLayout(null);
    

    而是在组件之间使用布局管理器或combinations of them以及extra spacing的边框。

    虽然null布局似乎是为Swing新手设计复杂GUI的最佳,最简单和最快捷的方式,但是你进步的越多,与你使用它们相关的问题就越多(如就是这样)

  2. 您正在从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

  3. 在添加所有元素之前,您的GUI处于可见状态,这可能会导致GUI在您将鼠标悬停在其上时不显示所有元素,这一行:

    frame.setVisible(true);
    

    应该是程序中的最后一行

  4. 您没有将您的程序放在导致您的应用程序不是线程安全的Event Dispatch Thread (EDT)上,您可以通过在main方法上写这个来修复它。

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            //Place your constructor here
        }
    });
    
  5. 您正在为textArea而不是scrollPane设置界限,但您不应该手动设置边界(请再次参见第1点)。

  6. 现在,您可以使用JTextAreaJScrollPane创建一个简单的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);
        }
    }
    

    产生此输出并在需要时添加滚动条(即当文本比它在视图中可以处理的行更远时)

    enter image description here enter image description here

    如果您希望始终显示垂直滚动条,则可以取消注释该行:

    scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    

    将产生以下输出:

    enter image description here enter image description here

    您可以在自己的docs中详细了解docsJScrollPane中的JTextArea

答案 1 :(得分:3)

 JPanel panelForScroll = new JPanel(null);

这会将 NULL布局设置为此JPanel。这将需要更多配置(就像您对框架对象所做的那样)。

只需删除null(也来自frame.setLayout(null)!)

答案 2 :(得分:1)

您必须使用Jtextpane来获取textarea上的滚动条。

JTextArea ta = new JTextArea();
JScrollPane sp = new JScrollPane(ta); 
JFrame f = new JFrame();
f.getContentPane().add(sp);

答案 3 :(得分:1)

您将面板的布局设置为null,然后您没有指定滚动条边界。由于您的面板中只有一个组件是滚动条,我建议使用FlowLayout