Java Swing如何修复JLabel大小

时间:2017-01-19 10:19:41

标签: java swing user-interface layout-manager gridbaglayout

我已经尽力修复JLabel的大小,但它不断变化,导致GUI中的其他项目移动。

我已经指定了组件的大小和间距。根据GridBagLayout的documentationipadxipady "指定内部填充:添加多少到大小组件。" 根据this帖子,setMinimumSizesetMaximumSize允许您设置组件的实际大小。由于我已经修复了大小和间距,因此只要文本出现在JLabel中,组件如何继续跳转?

我能够在实践中通过在空文本中添加空格来解决这个问题,但这一直困扰着我。什么是我不明白这个?

这是一个证明问题的SSCCE。它具有排列在GridBagLayout中的元素,并且在一个单元格中更改一个JLabel的内容会导致所有项目移动。

import javax.swing.*;
import java.awt.*;
import java.io.*;

public class F {
public static void main(String[] args) throws IOException, InterruptedException {
    JFrame frame = new JFrame();

    JPanel mainView = new JPanel();
    mainView.setPreferredSize(new Dimension(300, 300));
    mainView.setLayout(new GridBagLayout());

    JPanel contents = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(1,3,3,3);
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.ipady = 2;
    gbc.anchor = GridBagConstraints.EAST;

    JLabel text1 = new JLabel("Some text: ");
    contents.add(text1, gbc);
    gbc.gridy++;
    JLabel text2 = new JLabel("More text: ");
    contents.add(text2, gbc);
    gbc.gridy++;
    JLabel text3 = new JLabel("Third line: ");
    contents.add(text3, gbc);
    gbc.gridx++;
    gbc.gridy = 0;

    JTextField textField1 = new JTextField(10);
    contents.add(textField1, gbc);
    gbc.gridx++;
    gbc.gridy++;
    gbc.gridx--;

    JTextField textField2 = new JTextField(10);
    contents.add(textField2, gbc);
    gbc.gridy++;

    JLabel sitePass = new JLabel("");
    sitePass.setMaximumSize(new Dimension(100, 15));
    sitePass.setMinimumSize(new Dimension(100, 15));
    //sitePass.setPreferredSize(new Dimension(100, 15)); // <-- this line fixes the problem
    contents.add(sitePass, gbc);

    mainView.add(contents);

    frame.add(mainView);
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    while (true) {
        Thread.sleep(1000);
        sitePass.setText("Pushup time");
        Thread.sleep(1000);
        sitePass.setText("");
    }
}
}

3 个答案:

答案 0 :(得分:3)

解决问题的一种方法。变化:

.parallax-window {
   min-height:837px;
}

要:

    JLabel sitePass = new JLabel("");

说明: JTextField sitePass = new JTextField("", 12); sitePass.setOpaque(false); sitePass.setBorder(null); 的默认大小由列数决定,并与字体和字体大小相结合。以下两个语句确保其外观为JTextField

改进之处还在于使文本字段行为像标签一样,这可能与以下内容类似:

JLabel

答案 1 :(得分:1)

Swing使用npm i进行一些布局。 设置它将更正您的标签。

我习惯通过设置preferredSizeJComponentminimum来确定maximum,以确保;)

PS:我将尝试添加有关如何使用它的更多信息。

答案 2 :(得分:1)

还有另一种方法可以使用像class TreatmentModelSerializer(serializers.ModelSerializer): meaning = serializers.SerializerMethodField('get_meaning') def get_meaning(self, instance): meaning = TreatmentType.objects.get(code=instance.treatmenttype).meaning return meaning class Meta: model = Treatment fields = [ 'patient', 'date', 'meaning', ] 这样的虚拟空格。

JComboBox
//javax.swing.plaf.basic.BasicComboBoxUI#getDefaultSize()
/**
 * Return the default size of an empty display area of the combo box using
 * the current renderer and font.
 *
 * @return the size of an empty display area
 * @see #getDisplaySize
 */
protected Dimension getDefaultSize() {
  // Calculates the height and width using the default text renderer
  Dimension d = getSizeForComponent(getDefaultListCellRenderer()
    .getListCellRendererComponent(listBox, " ", -1, false, false));
  return new Dimension(d.width, d.height);
}