当垂直滚动条可见时,Swing BoxLayout水平滚动条

当垂直滚动条可见时,Swing BoxLayout水平滚动条,swing,scrollbar,visibility,Swing,Scrollbar,Visibility,在下面的SSCCE中,您会看到一个水平滚动条出现,尽管可以只使用垂直滚动条。这只是一个例子。我使用我自己的LayoutManager,而不是BoxLayout,但如果您有解决方案,我可能可以在我自己的LayoutManager中使用它 我已经尝试了一个自定义JPanel,它实现了Scrollable,然后覆盖TrackScrollableViewportWidth并返回true,但没有得到我想要的结果。文本的右边被剪掉了 还有一件事,虽然不那么重要,但仍然让我很恼火:如果你增加窗口的宽度,水平滚

在下面的SSCCE中,您会看到一个水平滚动条出现,尽管可以只使用垂直滚动条。这只是一个例子。我使用我自己的LayoutManager,而不是BoxLayout,但如果您有解决方案,我可能可以在我自己的LayoutManager中使用它

我已经尝试了一个自定义JPanel,它实现了Scrollable,然后覆盖TrackScrollableViewportWidth并返回true,但没有得到我想要的结果。文本的右边被剪掉了

还有一件事,虽然不那么重要,但仍然让我很恼火:如果你增加窗口的宽度,水平滚动条就会消失,JTextArea的宽度也会增加。但是,如果减小窗口的宽度,JTextArea不会相应地调整其宽度

提前谢谢。以下是SSCCE:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class MyFrame extends JFrame
{
    private static final long serialVersionUID = 1L;

    public static void main(final String[] args)
    {
        new MyFrame();
    }

    private MyFrame()
    {

        setTitle("Scrollbars and width");
        setSize(800, 200);
        setResizable(true);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel container = new JPanel();
        final BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
        container.setLayout(layout);

        final JTextArea area1 = new JTextArea();
        area1.setText("1sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf ");
        area1.setLineWrap(true);
        area1.setWrapStyleWord(true);
        area1.setEditable(false);
        area1.setForeground(Color.RED);
        container.add(area1);

        final JTextArea area2 = new JTextArea();
        area2.setText("2sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf sdh jsdfk laskdf hdkf hsjdf ");
        area2.setLineWrap(true);
        area2.setWrapStyleWord(true);
        area2.setEditable(false);
        area2.setBackground(Color.RED);
        container.add(area2);

        final JScrollPane scrollbox = new JScrollPane(container);

        this.getContentPane().add(scrollbox, BorderLayout.CENTER);

        this.getContentPane().invalidate();
        this.getContentPane().validate();

    }
}

与BoxLayout无关,请更改为单列GridLayout进行验证

原因(很可能)是文本区域的大小调整行为有点奇怪——在进行真正的操作(即由LayoutManager进行大小调整)之前,需要对其进行一些内部初始化。添加一个假的大小调用(在区域配置期间的某个地方),精确的值是不相关的

  area1.setSize(1, Short.MAX_VALUE);