Java JScrollPane在使用setMaximumSize添加JLabel时添加错误的水平滚动

Java JScrollPane在使用setMaximumSize添加JLabel时添加错误的水平滚动,java,swing,jpanel,jlabel,jscrollpane,Java,Swing,Jpanel,Jlabel,Jscrollpane,任务:使用BoxLayout向JPanel添加一些带有文本的JLabel,然后将此面板添加到JScrollPane,以便向下滚动该文本标签 问题: 我设置了text.setMaximumSize(..),但JScrollPane不这么认为,并添加了水平滚动条。text.setPreferredSize限制非常完美,但我不能使用它,因为我需要计算每个标签的高度(可能使用字体大小和获取标签自动换行符),这对我来说很难 以下是代码: import javax.swing.*; import ja

任务:使用BoxLayout向JPanel添加一些带有文本的JLabel,然后将此面板添加到JScrollPane,以便向下滚动该文本标签


问题

我设置了text.setMaximumSize(..),但JScrollPane不这么认为,并添加了水平滚动条。text.setPreferredSize限制非常完美,但我不能使用它,因为我需要计算每个标签的高度(可能使用字体大小和获取标签自动换行符),这对我来说很难


以下是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class NewPanel {

    private JFrame frame;
    private JLabel text;

    public NewPanel() {
        int formWidth = 700;
        int formHeight = 700;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100; i++)
            sb.append("Test String ");
        String resStr = "<html>" + sb.toString() + "</html>";

        text = new JLabel();
        text.setText(resStr);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(text);

        JScrollPane scrollPane = new JScrollPane(
                panel,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
        );

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setPreferredSize(new Dimension(formWidth, formHeight));
        frame.add(scrollPane);
        frame.pack();

        //Change max width for label with form resize
        frame.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                super.componentResized(e);
                resizePanels();
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                super.componentMoved(e);
                resizePanels();
            }
        });

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void resizePanels() {
        int labelSize = frame.getWidth() - 200;
            // - 200 For show that text limited by setMaximumSize

        text.setMaximumSize(new Dimension(labelSize, Integer.MAX_VALUE));
            //Integer.MAX_VALUE - for unlimited height (maybe exist better way?)

        //text.setPreferredSize(new Dimension(labelSize, 1000));
            //limit perfect and hide horizontal scroll, but don't think that it better way
            //because i need get plane border "back to back" text border,
            //so i must count label height (front height + maybe label auto line break place)
            //that look like hard way
        text.revalidate();
        text.repaint();
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ComponentAdapter;
导入java.awt.event.ComponentEvent;
公共类新面板{
私有JFrame;
私有JLabel文本;
公共事务委员会(){
int formWidth=700;
int formHeight=700;
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<100;i++)
sb.追加(“测试字符串”);
字符串resStr=“”+sb.toString()+”;
text=新的JLabel();
text.setText(resStr);
JPanel面板=新的JPanel();
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
添加(文本);
JScrollPane scrollPane=新的JScrollPane(
面板
JScrollPane.VERTICAL\u滚动条\u根据需要,
JScrollPane.HORIZONTAL\u滚动条\u根据需要
);
frame=新的JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setPreferredSize(新尺寸(formWidth、formHeight));
frame.add(滚动窗格);
frame.pack();
//使用表单调整大小更改标签的最大宽度
frame.addComponentListener(新的ComponentAdapter(){
@凌驾
公共无效组件已恢复(组件事件e){
超级。组件电阻化(e);
调整面板的大小();
}
@凌驾
公共无效组件已移动(组件事件e){
超级组件(e);
调整面板的大小();
}
});
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
私有void resizePanels(){
int labelSize=frame.getWidth()-200;
//-200用于显示受setMaximumSize限制的文本
setMaximumSize(新维度(标签大小,整数.MAX_值));
//Integer.MAX_值-用于无限高度(可能存在更好的方式?)
//text.setPreferredSize(新尺寸(labelSize,1000));
//限制完美和隐藏水平滚动,但不要认为这是更好的方式
//因为我需要得到“背对背”的文本边框,
//所以我必须计算标签高度(正面高度+标签自动换行位置)
//看起来很难
text.revalidate();
text.repaint();
}
}

您不需要计算任何东西的大小,这是布局管理器的重点,避免使用setMaximum/minimum/preferredSize
text.updateUI()-不要使用updateUI()方法。该方法在LAF更改时在内部调用。当您向面板添加组件时,您应该在面板上调用revalidate()和repaint()。@程序员:那么我如何才能做到这一点呢?不幸的是,我找不到如何为我的任务调整布局管理器,也许你能给我举个例子?@camickr谢谢你的建议,我在你所说的帖子中替换了方法并编辑了代码。好的,我找到了解决方案,但不是用JLabel,所以只需将JLabel替换为JTextArea,然后在resize:textArea.setMaximumSize(新维度(frame.getWidth(),整数。最大值);textArea.revalidate();textArea.repaint();