Java JScrollPane在使用setMaximumSize添加JLabel时添加错误的水平滚动
任务:使用BoxLayout向JPanel添加一些带有文本的JLabel,然后将此面板添加到JScrollPane,以便向下滚动该文本标签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
问题: 我设置了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/preferredSizetext.updateUI()代码>-不要使用updateUI()方法。该方法在LAF更改时在内部调用。当您向面板添加组件时,您应该在面板上调用revalidate()和repaint()。@程序员:那么我如何才能做到这一点呢?不幸的是,我找不到如何为我的任务调整布局管理器,也许你能给我举个例子?@camickr谢谢你的建议,我在你所说的帖子中替换了方法并编辑了代码。好的,我找到了解决方案,但不是用JLabel,所以只需将JLabel替换为JTextArea,然后在resize:textArea.setMaximumSize(新维度(frame.getWidth(),整数。最大值);textArea.revalidate();textArea.repaint();