使用 Java Swing 添加滚动条到 JTextArea

Adding scroll bars with Java Swing into a JTextArea

我看过几篇关于这个主题的帖子,但我不能用那里提供的信息解决问题。我正在尝试使用以下代码将滚动条(垂直和水平)添加到 JTextArea 中,如下所示:

public FPrincipale() {

        JFrame wframe = new JFrame();

        JPanel wpanel = new JPanel(new BorderLayout());
        JPanel tpanel = new JPanel();
        JPanel bpanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

        textzone = new JTextArea(" ",20, 50);
        textzone.setLineWrap(true);
        textzone.setWrapStyleWord(true);

        //Here I try to add the scroll bar
        JScrollPane wscroll = new JScrollPane(textzone, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        wscroll.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        wscroll.setBorder(BorderFactory.createLineBorder(Color.black));
        wframe.add(wscroll);
        wframe.setVisible(true);

        JButton b1 = new JButton("B1");
        JButton b2 = new JButton("B2");
        JButton b3 = new JButton("Close");      

        bpanel.add(b1);
        bpanel.add(b2);     
        bpanel.add(b3);     
        bpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        tpanel.add(textzone);
        tpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        tpanel.add(wscroll, BorderLayout.CENTER);

        wpanel.add(bpanel, BorderLayout.SOUTH);
        wpanel.add(tpanel, BorderLayout.CENTER);

        wframe.setLocation(150, 100);
        wframe.setPreferredSize(new Dimension(640, 480));

        b1.addActionListener(new b1Listener());
        b2.addActionListener(new b2Listener());
        b3.addActionListener(new b3Listener());

        this.getContentPane().setPreferredSize(new Dimension(500,500));     

        wframe.add(wpanel);
        wframe.setVisible(true);
        wframe.setSize(640, 640);
        wframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
        wframe.setTitle("Main Window");
        pack();

    }

然而,创建 window 时,即使我减小 window 的大小,滚动条也不起作用:

正常Window:

缩小尺寸:

我该如何解决这个问题?

首先摆脱 class 到 setPreferredSize,这会让您陷入困境。稍后在您的代码中调用 tpanel.add(textzone);,它从 JScrollPane 中删除 JTextArea 并将其添加到 tpanel(然后将 JScrollPane 添加到很好,这就是为什么你旁边有那个小方块。

首先将 BorderLayout 应用于 tpanel

JPanel tpanel = new JPanel(new BorderLayout());

删除将滚动窗格添加到框架的行...

//wFrame.add(wscroll);

然后仅将 JScrollPane 添加到 tpanel

//tpanel.add(textzone);
tpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
tpanel.add(wscroll, BorderLayout.CENTER);