当某些组件调整大小时,BoxLayout中的java组件会移动
public class LabelResizing2 {
public static JPanel createSliderPanel(
int min, int max, int curr)
{
/*outer panel*/
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createRaisedBevelBorder());
final JLabel valueLabel = new JLabel();
valueLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
/*set up slider*/
final JSlider slider = new JSlider(JSlider.VERTICAL, min, max, curr);
slider.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(valueLabel);
panel.add(slider);
/*slider move event*/
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent event) {
valueLabel.setText(Integer.toString(slider.getValue()));
}
});
valueLabel.setText(Integer.toString(curr));
return panel;
}
public static void main(String[] args) {
JFrame gui = new JFrame("Label Resizing");
gui.setMinimumSize(new Dimension(500, 500));
gui.add(createSliderPanel(-100, 100, 0));
gui.setVisible(true);
}
}
这里的问题是,当标签的大小从“99”调整到“100”以及从“0”调整到“-1”等时,滑块将到处移动
几个问题:
- 为什么它会蹦蹦跳跳李>
如果我投入
valueLabel.setSize(100, 100);
它完全不起作用。为什么?valueLabel.setMinimumSize(100,100);
将停止它的反弹,但实际上不会调整标签的大小。为什么?我找到的最好的解决办法是去
slider.setAlignmentX(Component.LEFT_ALIGNMENT);
这是个好办法吗然而,这对CENTER_ALIGNMENT
或RIGHT_ALIGNMENT
不起作用,这里发生了什么如果我们稍微修改一下,将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);
即使labelPanel没有调整大小(valueLabel在其内部调整大小),滑块仍会四处移动。这是怎么回事?布局管理器是否也在查看嵌套组件
# 1 楼答案
这就是这个特殊布局管理器的本质。当组件的
preferredSize
发生更改时,布局管理器正在更新布局在布局管理器的控制下更改组件的大小没有任何效果,因为布局管理器在重新布局其子组件时将调整组件的大小
preferred/minimum/maximumSize
是布局管理者可以用来决定如何最好地执行其个人布局的“建议”,他们没有义务以任何方式使用它们我想是的,但是“请注意,这些只是提示,可能会被某些版面管理员忽略”
现在,组件不再直接受布局管理器的影响,每个面板都会影响它的父布局管理器、最终结果和一些问题
用示例更新
在这种情况下,你可以作弊一点