当文本发生变化时,如何阻止JLabel更改其大小?

Amr*_*hit 4 java swing resize jlabel gridbaglayout

我在代码中生成一些JComponents并使用GridBag布局来排列它们.我的布局由12行和3列组成,每行包含一个JSlider,一个JCheckBox和一个JLabel.这是我用来生成UI的代码:

final int NUM_MOTORS = 12;

// This is the panel I'm adding the components to.
pnlMotorSliders.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

for (int i = 0; i < NUM_MOTORS; ++i) {
    c.gridy = i;

    // Create the slider
    JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 10, 4085, 10);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.weightx = 0.9;
    pnlMotorSliders.add(slider, c);

    // Create the checkbox
    JCheckBox checkBox = new JCheckBox();
    checkBox.setOpaque(true);
    checkBox.setBackground(Color.blue);
    c.fill = GridBagConstraints.NONE;
    c.gridx = 1;
    c.weightx = 0.1;
    pnlMotorSliders.add(checkBox, c);

    // Create the current label
    JLabel label = new JLabel("0");
    label.setBorder(BorderFactory.createLineBorder(Color.red));
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 2;
    c.weightx = 0.2;
    pnlMotorSliders.add(label, c);
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我在任何JLabel中设置文本时,它们会改变它们的宽度并影响布局的其余部分,即使我设置的文本宽度看起来远小于JLabel的宽度.以下两个屏幕截图展示了我的意思(红色和蓝色边框用于调试目的):

更改JLabel文本之前的布局.

更改底部JLabel文本后的布局. 注意标签是如何变大的.

我已将底部JLabel上的文本设置为"-12".即使JLabel看起来比文本宽得多,它也改变了它的大小,影响了其余的布局.

为什么会发生这种情况,我该怎么做才能阻止它呢?

bri*_*ium 5

您可以通过设置最小,首选和最大尺寸来修复标签的大小:

label.setMinimumSize(width, height);
label.setPreferedSize(width, height);
label.setMaximumSize(width, height);
Run Code Online (Sandbox Code Playgroud)

还要确保将GridBagConstraints#fill设置为NONE,尽管我不确定是否仍然需要(我认为是).

编辑:顺便说一句,要摆脱焦点组件周围的那些讨厌的虚线,你可以将它设置为不可聚焦:

slider.setFocusable(false);
Run Code Online (Sandbox Code Playgroud)

  • 不,无论问题是什么,[调整组件的大小提示都不是解决方案](http://stackoverflow.com/a/7229519/203657)...相反,使用一个像样的LayoutManager (3认同)