我已经尽力修复JLabel的大小,但它不断变化,导致GUI中的其他项目移动。
我已经指定了组件的大小和间距。根据GridBagLayout的documentation,ipadx
和ipady
"指定内部填充:添加多少到大小组件。" 根据this帖子,setMinimumSize
和setMaximumSize
允许您设置组件的实际大小。由于我已经修复了大小和间距,因此只要文本出现在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("");
}
}
}
答案 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
进行一些布局。
设置它将更正您的标签。
我习惯通过设置preferredSize
,JComponent
和minimum
来确定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);
}