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 がその中でサイズ変更されています)、スライダーは引き続き動きます。何が起きてる?レイアウト マネージャーはネストされたコンポーネントも参照していますか?