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()
方法,使宽度等于父容器的大小?