我正在开发一个项目,我的目标是根据窗口大小调整组件大小。我正在使用GridBagLayout
,但是当窗口调整大小时使组件调整大小时遇到一些问题。当我给出我的组件weighty
值时,一切都很好,组件垂直调整大小。 http://imageshack.us/a/img211/9682/d8au.png
但是当我分配weightx
值时,一切都搞砸了。按钮的大小会发生变化,标签之间会出现一些间隙。
http://imageshack.us/a/img12/6946/ij4.png
我没有将weightx
和weighty
值分配给所有组件,只分配我需要的组件。我没有编写GUI代码,我只是拖放组件,所以没有代码。我只需要一些关于如何解决这个问题的建议,以便组件正确调整大小。我想,这是因为weightx
,但我不知道如何使一切正常。
答案 0 :(得分:2)
首先,不要像在本网站上建议的那样使用空布局。使用null布局通常是Swing新手提出的解决方案,因为从表面上看, 更容易使用,但后来你发现了它的所有问题,包括丑陋或无法运行的GUI当尝试在不同平台上运行应用程序时,如果想要修改GUI中的任何内容,则需要进行极大的修改,因为这需要手动修改修改后的组件正确或下方的所有其他组件。使用布局管理器的美妙之处在于它允许他们为您完成艰苦的工作,使维护和升级变得轻而易举。
我建议使用嵌套布局嵌套JPanel。例如,计算器按钮表现为固定网格,因此对于JLabel占位符使用GridLayout,底部没有按钮。
如果需要,外部GUI JPanel可以是GridBagLayout,或者您可以轻松地混合使用其他更简单的布局。
答案 1 :(得分:2)
正如我在评论中提到的那样,已经被Hovercraft提出建议,我建议将UI分解为几个部分,分别关注每个部分的布局要求,否则你会发现你为一个组件做出的决定会对他人产生不利影响。
我还建议您避免使用GUI设计器,直到您对布局实际执行的内容有一个合理的理解并手动编写布局。不要误会我的意思,我一直使用Netbeans表单设计器,但我也手动调整了很多UI,特别是当你需要生成动态和不断变化的UI时
以下演示了我在说什么。我已经使用LineBorder
突出显示了用户界面的每个部分,以使其保持原状。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class BadLayout25 {
public static void main(String[] args) {
new BadLayout25();
}
public BadLayout25() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new BasePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BasePane extends JPanel {
public BasePane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
add(getTopPane(), gbc);
gbc = new java.awt.GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
add(getOptionsPane(), gbc);
gbc = new java.awt.GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.weightx = 0.5;
gbc.weighty = 1.0;
add(getButtonPane(), gbc);
JTextArea textArea = new JTextArea(5, 20);
gbc = new java.awt.GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridheight = 2;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.weightx = 0.5;
gbc.weighty = 1.0;
add(new JScrollPane(textArea), gbc);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 400);
}
protected JPanel getTopPane() {
JPanel topPane = new JPanel(new GridBagLayout());
topPane.setBorder(BorderFactory.createLineBorder(java.awt.Color.RED));
topPane.add(new JLabel("Lotereya:"));
topPane.add(new JLabel("Yuklenilir"));
return topPane;
}
protected JPanel getOptionsPane() {
JPanel optionsPane = new JPanel(new GridBagLayout());
optionsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 255, 0)));
GridBagConstraints gbc = new GridBagConstraints();
gbc = new GridBagConstraints();
gbc.anchor = java.awt.GridBagConstraints.LINE_START;
optionsPane.add(new JLabel("Tiraj nomre:"), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 2;
gbc.anchor = java.awt.GridBagConstraints.LINE_START;
optionsPane.add(new JLabel("Sablon nomresi:"), gbc);
JTextField field = new JTextField(10);
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 1;
gbc.anchor = java.awt.GridBagConstraints.LINE_START;
gbc.weightx = 1.0;
optionsPane.add(field, gbc);
JComboBox comboBox = new JComboBox();
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.anchor = java.awt.GridBagConstraints.LINE_START;
gbc.weightx = 1.0;
optionsPane.add(comboBox, gbc);
return optionsPane;
}
protected JPanel getButtonPane() {
JPanel buttonsPane = new JPanel(new GridBagLayout());
buttonsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 255)));
GridBagConstraints gbc = new GridBagConstraints();
gbc = new java.awt.GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = -1;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.weightx = 0.25;
gbc.weighty = 0.25;
for (int index = 0; index < 9; index++) {
if (index % 3 == 0) {
gbc.gridy++;
gbc.gridx = 0;
} else {
gbc.gridx++;
}
buttonsPane.add(new JButton(String.valueOf(index + 1)), gbc);
}
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 3;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.weightx = 0.25;
gbc.weighty = 0.25;
buttonsPane.add(new JButton("0"), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.weightx = 0.25;
gbc.weighty = 0.25;
buttonsPane.add(new JButton("Tesdiq"), gbc);
gbc.gridy++;
buttonsPane.add(new JButton("<ticket.apply>"), gbc);
gbc.gridy++;
buttonsPane.add(new JButton("<ticket.cancel>"), gbc);
gbc.gridy++;
buttonsPane.add(new JButton("<main menu>"), gbc);
return buttonsPane;
}
}
}