Java 如何限制JScrollPane组件的宽度

Java 如何限制JScrollPane组件的宽度,java,swing,Java,Swing,我有一个JScrollPane,在一个使用gridbagloayout的面板中有许多JLabel对象。每个标签都显示HTML文本,其中包含丰富的元素,这些元素在运行时会发生变化 我希望所有标签都具有相同的宽度(由滚动窗格的宽度决定),但高度随文本包装内容的不同而不同(由JLabel自动处理)。如果标签超过滚动窗格的高度,则应显示垂直滚动条 下面是一些示例代码来演示该问题: public class ScrollLabels extends JFrame { private final J

我有一个
JScrollPane
,在一个使用
gridbagloayout
的面板中有许多
JLabel
对象。每个标签都显示HTML文本,其中包含丰富的元素,这些元素在运行时会发生变化

我希望所有标签都具有相同的宽度(由滚动窗格的宽度决定),但高度随文本包装内容的不同而不同(由
JLabel
自动处理)。如果标签超过滚动窗格的高度,则应显示垂直滚动条

下面是一些示例代码来演示该问题:

public class ScrollLabels extends JFrame {
    private final JPanel labelPanel = new JPanel(new GridBagLayout());
    private final GridBagConstraints c = new GridBagConstraints();

    public ScrollLabels() throws HeadlessException {
        super("Scroll Labels");
    }

    public void createUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane scroller = new JScrollPane(labelPanel);
        add(scroller);
        c.gridx = 0;
        c.gridy = GridBagConstraints.RELATIVE;
        c.fill = GridBagConstraints.HORIZONTAL;
        addLabel("Here is <em>Rich Text</em>");
        addLabel("Here is <ul><li>A</li><li>List</li></ul>");
        addLabel("Here is <table><tr><th>A</th><th>Table></th></tr></table");
        addLabel("Here is more <em>Rich Text</em>");
        addLabel("Here is even more <b>Rich Text</b>");
        addLabel("Here is a long sentence that should wrap when the panel "
                + "is too small for the text.");
        pack();
    }

    private void addLabel(String text) {
        JLabel label = new JLabel("<html>" + text + "</html>");
        label.setBorder(BorderFactory.createEtchedBorder());
        labelPanel.add(label, c);
    }

    public static void main(String[] args) {
        ScrollLabels frame = new ScrollLabels();
        frame.createUI();
        frame.setVisible(true);
    }    
}
公共类滚动标签扩展JFrame{
私有最终JPanel labelPanel=新JPanel(新GridBagLayout());
private final GridBagConstraints c=新的GridBagConstraints();
public ScrollLabels()引发HeadlesException{
超级(“滚动标签”);
}
public void createUI(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scroller=新的JScrollPane(labelPanel);
添加(滚动条);
c、 gridx=0;
c、 gridy=GridBagConstraints.RELATIVE;
c、 填充=GridBagConstraints.HORIZONTAL;
addLabel(“这里是富文本”);
添加标签(“这里是
  • A
  • 列表
”; addLabel(“此处是ATable> 我希望所有标签具有相同的宽度(由滚动窗格的宽度驱动),但高度根据其内容而有所不同

您需要在面板上实现
Scrollable
接口,并覆盖
getScrollableTracksViewportWidth()
方法以返回
true
。您还需要为接口的其他方法提供默认实现

或者,您可以使用提供的方法来设置滚动属性

我希望所有标签具有相同的宽度(由滚动窗格的宽度驱动),但高度根据其内容而有所不同

您需要在面板上实现
Scrollable
接口,并覆盖
getScrollableTracksViewportWidth()
方法以返回
true
。您还需要为接口的其他方法提供默认实现


或者,您可以使用提供的方法来设置滚动属性。

“使用
GridBagLayout
,面板中的许多
JLabel
对象。每个标签都显示HTML文本“不确定是否适用于此用例,但我通常会使用样式指定宽度。例如,如中所示。”使用
GridBagLayout
的面板中的许多
JLabel
对象。每个标签都显示HTML文本"不确定它是否适用于此用例,但我通常会使用样式指定宽度。例如,如中所示。感谢您的帮助,我不知道可滚动。这似乎是正确的方法。我仍然存在一个问题,即如果需要任何包装,面板会跳到最小宽度。您以前见过这个问题吗?如果没有,我会做一些挖掘如果我想不出来,请发一个新问题。@sprinter,这是调整面板大小以适应视口的解决方案。
我仍然有一个问题,即面板跳转到最小宽度
-不,面板宽度不会改变。面板上标签的大小可能会改变。GridBagLayout就是这样工作的。如果组件的大小不能改变放入提供的区域,然后使用组件的最小大小。也许您可以使用自定义JLabel并覆盖
getMinimumSize()
将宽度设置为父容器大小的方法?感谢您的帮助,我没有意识到可滚动。这似乎是正确的方法。我仍然存在一个问题,即如果需要任何包装,面板会跳到最小宽度。您以前见过这个问题吗?如果没有,我将进行一些挖掘,如果无法理解,将发布一个新问题out.@sprinter,这是调整面板大小以适应视口的解决方案。
我仍然有一个问题,即面板跳转到最小宽度
-否面板宽度不会改变。面板上标签的大小可能会改变。GridBagLayout就是这样工作的。如果组件的大小不能适应提供的区域,则最小si使用组件的大小。也许您可以使用自定义JLabel并重写
getMinimumSize()
方法,使宽度等于父容器的大小?