【问题标题】:Swing BoxLayout horizontal scrollbar when vertical scrollbar is visible当垂直滚动条可见时 Swing BoxLayout 水平滚动条
【发布时间】:2011-11-30 15:20:28
【问题描述】:

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

我已经尝试使用实现 Scrollable 的自定义 JPanel,然后覆盖 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();

    }
}

【问题讨论】:

    标签: swing scrollbar visibility


    【解决方案1】:

    与BoxLayout无关,改为单列GridLayout验证。

    原因(很可能)是文本区域稍微奇怪的大小调整行为 - 在执行实际操作(即由 LayoutManager 调整大小)之前,需要将其推入一些内部初始化。添加一个虚假的大小调用(在区域配置期间的某个地方),确切的值无关紧要

      area1.setSize(1, Short.MAX_VALUE);
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2013-12-18
      • 2014-09-21
      • 1970-01-01
      • 2022-06-21
      • 2012-11-14
      • 2014-08-27
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多