代码之家  ›  专栏  ›  技术社区  ›  Gotler

JScrollPane中的动态JTextArea位于滚动条下

  •  0
  • Gotler  · 技术社区  · 7 年前

    随着文本区域中文本的增长,最终会出现垂直滚动条,隐藏部分文本区域。当滚动条出现时,我希望滚动条能够根据需要调整其内容的大小。

    我发现的一个解决方法是始终显示垂直滚动条,但这看起来并不好,因为很少需要它。

    import javax.swing.*;
    import java.awt.*;
    import static javax.swing.ScrollPaneConstants.*;
    
    public class Test {
        public static void main(String[] args) {
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            panel.add(new JLabel("text"));
            panel.add(new JLabel("text"));
            panel.add(new JLabel("text"));
    
            JTextArea textArea = new JTextArea();
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
            textArea.setText("This text fits");
            panel.add(textArea);
    
            JScrollPane scrollPane =
                    new JScrollPane(panel, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_NEVER);
    
            JFrame frame = new JFrame("Title");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.getContentPane().add(scrollPane);
    
            frame.pack();
            frame.setVisible(true);
        }
    }
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   Andrew Thompson    7 年前

    要解决问题,请更改:

    JTextArea textArea = new JTextArea();
    

    收件人:

    JTextArea textArea = new JTextArea(1,20);
    

    通过向文本区域提供大小提示,当添加更多文本时,滚动窗格能够更好地处理它。

        2
  •  0
  •   camickr    7 年前

    相反,您需要实现 Scrollable 界面来告诉滚动窗格,面板应始终适合滚动窗格的宽度。这将导致在添加文本时正确包装文本区域中的文本。

    可滚动 界面,您可以使用 Scrollable Panel

    您只需按以下方式更改代码:

    //JPanel panel = new JPanel();
    ScrollablePanel panel = new ScrollablePanel();
    panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
    
        3
  •  0
  •   Aman    7 年前

    只是组件放置的问题。参考以下代码:

    public TestFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
    
        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane);
    
        JPanel panel = new JPanel();
        scrollPane.setColumnHeaderView(panel);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    
        JLabel lblNewLabel = new JLabel("text");
        panel.add(lblNewLabel);
    
        JLabel lblNewLabel_2 = new JLabel("text");
        panel.add(lblNewLabel_2);
    
        JLabel lblNewLabel_1 = new JLabel("text");
        panel.add(lblNewLabel_1);
    
        JTextArea textArea = new JTextArea();
        textArea.setLineWrap(true);
        textArea.setText("This text fits");
        scrollPane.setViewportView(textArea);
    }
    

    希望这会有所帮助。:-)

        4
  •  -1
  •   Antony Ng    7 年前

    但您需要首先将textArea和scrollPane变为属性,因为您需要在以后引用它们:

    private static JTextArea textArea;
    private static JScrollPane scrollPane;
    
    public static void main(String[] args) {
        JPanel panel = new JPanel() {
            @Override
            public void doLayout() {
                super.doLayout();
    
                if (scrollPane.getVerticalScrollBar().isVisible()) {
                    textArea.setSize(textArea.getWidth() - 3, textArea.getHeight());
                }
            }
        };