Swing GridBagLayout 组件调整大小 [英] Swing GridBagLayout component resizing
问题描述
我正在做一个项目,我的目标是根据窗口的大小调整组件的大小.我为此使用了 GridBagLayout
,但是在调整窗口大小时调整组件大小时遇到了一些问题.当我给我的组件 weighty
值时,一切都很好,组件垂直调整大小.http://imageshack.us/a/img211/9682/d8au.png但是当我分配 weightx
值时,一切都被搞砸了.按钮的大小会发生变化,标签之间会出现一些间隙.http://imageshack.us/a/img12/6946/ij4.png
I am working on a project and my goal is to make the components resize according to the size of the window. I am using GridBagLayout
for this, however I am experiencing some problems when making the components resize when the window resizes. When I give my components weighty
value, everything is fine, the components resize Vertically. http://imageshack.us/a/img211/9682/d8au.png
But when I assign the weightx
value, everything is being messed up. The buttons change in size, some gaps appear between Labels.
http://imageshack.us/a/img12/6946/ij4.png
我不会将 weightx
和 weighty
值分配给所有组件,只分配我需要的组件.我不编写 GUI,我只是拖放组件,所以没有代码.我只需要一些有关如何解决此问题的建议,以便正确调整组件的大小.我想,这是因为 weightx
,但我不知道如何让一切正常工作.
I don't assign the weightx
and weighty
values to all of the components, only the ones I need. I do not code the GUI, I just drag&drop the components, so there is no code. I just need some advice on how to fix this, so that the components are resizing correctly. I suppose, this is because of the weightx
, but I don't have an idea on how to make everything work fine.
推荐答案
正如我在评论中所建议的,并且 Hovercraft 已经建议,我建议将您的 UI 分解为多个部分,重点关注每个部分分开,否则你会发现你为一个组件所做的决定会对其他组件产生不利影响.
As I suggested in my comment, and which has already being suggested by Hovercraft, I'd recommend breaking you UI down into sections, focusing on the layout requirements of each section separately, otherwise you will find decisions you make for one component will have adverse effects on others.
我还建议您避免使用 GUI 设计人员,直到您对布局的实际作用有了合理的了解并手动编写布局代码.不要误会我的意思,我一直在使用 Netbeans 表单设计器,但我也会手动调整我的许多 UI,尤其是当您需要生成动态且不断变化的 UI 时
I'd also recommend avoiding GUI designers until you have a reasonable understanding of what the layouts are actually doing and code the layouts by hand. Don't get me wrong, I use Netbeans form designer all the time, but I also tweak many of my UIs by hand, especially when you need to produce dynamic and changing UIs
下面演示了我在说什么.我已经使用 LineBorder
突出显示了 UI 的每个部分,以使其站立起来.
The following demonstrates what I'm talking about. I've highlighted each section of the UI with the use a LineBorder
to make it stand it.
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;
}
}
}
这篇关于Swing GridBagLayout 组件调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!