对于我的Java Swing GUI,我有两个主要组件:
一部分是几个复选框的垂直列表,另一部分是图像。
当jframe窗口调整大小/最大化时,比例保持不变,因为我更希望复选框列表的绝对大小保持不变,只是图像调整大小如下:
这可以使用GridBagLayout吗?
我使用以下内容将JPanel
(ContentPane
)整理成一个:
复选框:
for(int i=0; i<5; i++){
GridBagConstraints gbc = new GridBagConstraints();
JCheckBox checkbox = new JCheckBox("CheckBox " + (i+1));
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = i;// Increases by one for each checkbox
gbc.insets = new Insets(0, 10, 5, 5);
gbc.weightx = 1;
gbc.weighty = 1;
contentPane.add(checkbox,gbc);
}
图片:注意我已将其替换为空白JList
,因为没有摆动图片组件我需要该组件与contentPane.add(...)
一起使用。
GridBagConstraints gbc = new GridBagConstraints();
JList list = new JList(new String[]{""});
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 10;
gbc.gridheight = 5;
gbc.gridx = 1;
gbc.gridy = 0;// Increases by one for each checkbox
gbc.insets = new Insets(0, 10, 5, 5);
gbc.weightx = 1;
gbc.weighty = 1;
contentPane.add(list,gbc);
答案 0 :(得分:2)
您可以使用BoxLayout
来避免复杂性!
import java.awt.*;
import javax.swing.*;
public class NewClass {
static JFrame aWindow = new JFrame("This is BOX LAYOUT");
public static void main(String[] args) {
JPanel panel1 = new JPanel();
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
panel1.setBackground(Color.yellow);
JPanel panel2 = new JPanel();
panel2.setLayout(new FlowLayout());
panel2.setBackground(Color.ORANGE);
for(int i = 0; i <5; i++)
panel1.add(new JCheckBox("CheckBox " + (i+1)));
aWindow.add(panel1,BorderLayout.WEST);
aWindow.add(panel2, BorderLayout.CENTER);
aWindow.setVisible(true);
aWindow.setSize(300,300);
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
答案 1 :(得分:1)
这绝对是可能的。
我认为你被绊倒的地方是你正在使用&#39; gbc.weighty = 1&#39;。这将使组件与其所在的组件以1:1的比例垂直调整组件。如果您不希望它在此方向上调整大小,则应将其更改为gbc.weighty = 0.
如果您在执行此操作后调整大小时将复选框固定到面板顶部时遇到问题,我会尝试这个小技巧。
在图片面板的左侧创建一个JPanel(我称之为Panel1)。在这个JPanel中,放置另一个JPanel(CheckBoxPanel),它将在gridx = 0,gridy = 0处保存您的复选框。将其设置为水平缩放,但不是垂直缩放,因此weightx = 1.0,weighty = 0。
现在将一个空的JLabel放在Panel1下面gridx = 0,gridy = 1.确保删除默认设置为标签的任何文本。将其设置为垂直缩放,因此JLabel将具有weighty = 1.这将确保在调整大小时,CheckBoxPanel将通过展开的JLabel推送到Panel1的顶部。如果您处于正常状态&#39;大小,JLabel的高度为0,所以你不会看到它。