Java 当某些组件调整大小时,BoxLayout中的组件将移动
这里的问题是,当标签的大小从“99”调整到“100”以及从“0”调整到“-1”等时,滑块将到处移动 几个问题:Java 当某些组件调整大小时,BoxLayout中的组件将移动,java,swing,resize,layout-manager,boxlayout,Java,Swing,Resize,Layout Manager,Boxlayout,这里的问题是,当标签的大小从“99”调整到“100”以及从“0”调整到“-1”等时,滑块将到处移动 几个问题: 为什么它会蹦蹦跳跳 如果我投入 valueLabel.setSize(100100) 它完全不起作用。为什么? valueLabel.setMinimumSize(100100) 将停止它的反弹,但实际上不会调整标签的大小。为什么? 我找到的最佳解决方案是使用slider.setAlignmentX(Component.LEFT_ALIGNMENT)这是一个好的解决方案吗?但是,这不适
valueLabel.setSize(100100)代码>
它完全不起作用。为什么?
valueLabel.setMinimumSize(100100)代码>
将停止它的反弹,但实际上不会调整标签的大小。为什么?
居中对齐
或右对齐
,这是怎么回事preferredSize
更改时,布局管理器将更新布局
2如果我加入
valueLabel.setSize(100100);它完全不起作用。为什么?valueLabel.setMinimumSize(100100);将停止它的反弹,但实际上不会调整标签的大小。为什么? 在布局管理器的控制下更改零部件的大小没有任何效果,因为布局管理器将在重新布局零部件的子零部件时调整零部件的大小
preferred/minimum/maximumSize
是布局管理者用来确定如何最好地执行其个人布局的“建议”,他们没有义务以任何方式使用它们
我找到的3个最佳解决方案是使用slider.setAlignmentX(Component.LEFT_ALIGNMENT);。这是个好主意吗
解决方案
我想是的,但“请注意,这些只是提示,可能会被某些布局管理器忽略”
4如果我们稍微修改一下,并将valueLabel放在面板中
现在,组件不是直接受布局管理器的影响,而是每个面板影响它的父布局管理器、净结果和一些问题
用示例更新
在这种情况下,你可以作弊一点
final JPanel labelPanel = new JPanel();
final JLabel valueLabel = new JLabel();
valueLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
labelPanel.add(valueLabel);
labelPanel.setBorder(BorderFactory.createLineBorder(Color.RED));
panel.add(labelPanel);
panel.add(slider);
公共类BadLayout03{
公共静态void main(字符串[]args){
新的BadLayout03();
}
公共广告版面03(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的TestLayout());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestLayout扩展了JPanel{
公共测试布局(){
setLayout(新的GridBagLayout());
最终JLabel值标签=新JLabel(“000”);
最终JSlider滑块=新JSlider();
slider.addChangeListener(新的ChangeListener(){
@凌驾
公共无效状态已更改(更改事件e){
StringBuilder sb=新的StringBuilder(Integer.toString(slider.getValue());
while(sb.length()<3){
sb.插入(0,“0”);
}
valueLabel.setText(sb.toString());
}
});
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.weightx=0.75;
gbc.anchor=GridBagConstraints.WEST;
valueLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
添加(valueLabel,gbc);
gbc.gridx=1;
gbc.weightx=1;
gbc.fill=GridBagConstraints.HORIZONTAL;
添加(滑块,gbc);
}
}
}
@user1068446嵌套意味着将一个嵌套在另一个嵌套中如果您将组件嵌套在一个JPanel上,面板将调整大小,而不是组件。嘿,谢谢。我补充了一个问题,如果你想回答的话。
final JPanel labelPanel = new JPanel();
final JLabel valueLabel = new JLabel();
valueLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
labelPanel.add(valueLabel);
labelPanel.setBorder(BorderFactory.createLineBorder(Color.RED));
panel.add(labelPanel);
panel.add(slider);
public class BadLayout03 {
public static void main(String[] args) {
new BadLayout03();
}
public BadLayout03() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestLayout());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestLayout extends JPanel {
public TestLayout() {
setLayout(new GridBagLayout());
final JLabel valueLabel = new JLabel("000");
final JSlider slider = new JSlider();
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
StringBuilder sb = new StringBuilder(Integer.toString(slider.getValue()));
while (sb.length() < 3) {
sb.insert(0, "0");
}
valueLabel.setText(sb.toString());
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.75;
gbc.anchor = GridBagConstraints.WEST;
valueLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(valueLabel, gbc);
gbc.gridx = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(slider, gbc);
}
}
}