这就是我想要实现的目标
------------------------| 150px |
| | width |
| | p2 |
| | |
| Fill frame | |
| p1 | |
| | |
| | |
------------------------| |
150px height | |
| p3 | |
---------------------------------
“填充帧”必须缩放动态,但其他两个正方形具有固定的宽度/高度。
我的代码确实产生了这种布局,但是p1没有缩放以填满整个帧。 有人可以告诉我如何使p1动态吗?
提前致谢。
这是我到目前为止所做的:
setTitle(Rolit.TITLE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainPanel = new JPanel();
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//P1 FILL P1 WITH 64 BUTTONS
p1 = new JPanel();
p1.setLayout(new GridLayout(8, 8));
p1.setMinimumSize(new Dimension(600, 600));
p1.setMaximumSize(new Dimension(600, 600));
p1.setPreferredSize(new Dimension(600, 600));
for(int y = 0; y < 8; y++){
for(int x = 0; x < 8; x++){
JButton btn = new JButton(x + " , " + y);
p1.add(btn);
}
}
//P2 FILL P2 WITH 4 BUTTONS
p2 = new JPanel();
p2.setLayout(new GridLayout(4, 1));
p2.setMinimumSize(new Dimension(150, 100));
p2.setMaximumSize(new Dimension(150, 100));
p2.setPreferredSize(new Dimension(150, 100));
for(int i = 0; i < 4; i++){
p2.add(new JButton("Button"));
}
//P3
p3 = new JPanel();
p3.setMinimumSize(new Dimension(100, 150));
p3.setMaximumSize(new Dimension(100, 150));
p3.setPreferredSize(new Dimension(100, 150));
p3.setBackground(Color.BLUE);
//ADD ALL TO mainPanel
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(p1, c);
c.gridx = 1;
c.gridheight = 2;
c.fill = GridBagConstraints.VERTICAL;
mainPanel.add(p2, c);
c.gridx = 0;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 2;
c.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(p3, c);
setContentPane(mainPanel);
pack();
setLocationRelativeTo(null);
setVisible(true);
答案 0 :(得分:3)
您需要为weightx
提供weighty
和GridBagConstraints
值,这些值会影响各个组件对父容器大小变化的响应以及占用的“重量”在给定的单元格内
请查看How to use GridBagLayout了解详情
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestGridBagLayout {
public static void main(String[] args) {
new TestGridBagLayout();
}
private JPanel mainPanel;
private JPanel p1;
private JPanel p2;
private JPanel p3;
public TestGridBagLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
mainPanel = new JPanel();
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
//P1 FILL P1 WITH 64 BUTTONS
p1 = new JPanel();
p1.setLayout(new GridLayout(8, 8));
p1.setMinimumSize(new Dimension(600, 600));
p1.setMaximumSize(new Dimension(600, 600));
p1.setPreferredSize(new Dimension(600, 600));
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
JButton btn = new JButton(x + " , " + y);
p1.add(btn);
}
}
//P2 FILL P2 WITH 4 BUTTONS
p2 = new JPanel();
p2.setLayout(new GridLayout(4, 1));
p2.setMinimumSize(new Dimension(150, 100));
p2.setMaximumSize(new Dimension(150, 100));
p2.setPreferredSize(new Dimension(150, 100));
for (int i = 0; i < 4; i++) {
p2.add(new JButton("Button"));
}
//P3
p3 = new JPanel();
p3.setMinimumSize(new Dimension(100, 150));
p3.setMaximumSize(new Dimension(100, 150));
p3.setPreferredSize(new Dimension(100, 150));
p3.setBackground(Color.BLUE);
//ADD ALL TO mainPanel
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
mainPanel.add(p1, c);
c.gridx = 1;
c.gridheight = 2;
c.weighty = 1;
c.weightx = 0;
c.fill = GridBagConstraints.VERTICAL;
mainPanel.add(p2, c);
c.gridx = 0;
c.gridy = 1;
c.gridheight = 1;
c.gridwidth = 2;
c.fill = GridBagConstraints.HORIZONTAL;
c.weighty = 0;
c.weightx = 1;
mainPanel.add(p3, c);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
答案 1 :(得分:3)
我会考虑使用使用BorderLayouts的嵌套JPanel。例如:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class EmielGui extends JPanel {
protected static final int DELTA_DIMEN = 1;
protected static final int MAX_DIMEN = 600;
private static final int DELAY = 20;
private JPanel rightPanel = new JPanel();
private JPanel bottomPanel = new JPanel();
private JPanel centerPanel = new JPanel();
private int dimen = 100;
public EmielGui() {
JPanel tempCenterPanel = new JPanel(new BorderLayout());
tempCenterPanel.add(centerPanel, BorderLayout.CENTER);
tempCenterPanel.add(bottomPanel, BorderLayout.SOUTH);
setLayout(new BorderLayout());
add(rightPanel, BorderLayout.EAST);
add(tempCenterPanel, BorderLayout.CENTER);
rightPanel.setMinimumSize(new Dimension(150, 0));
bottomPanel.setMinimumSize(new Dimension(0, 150));
rightPanel.setPreferredSize(rightPanel.getMinimumSize());
bottomPanel.setPreferredSize(bottomPanel.getMinimumSize());
rightPanel.setBorder(BorderFactory.createLineBorder(Color.red));
bottomPanel.setBorder(BorderFactory.createLineBorder(Color.blue));
centerPanel.setBorder(BorderFactory.createLineBorder(Color.green));
new Timer(DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dimen += DELTA_DIMEN;
if (dimen < MAX_DIMEN) {
centerPanel.setPreferredSize(new Dimension(dimen, dimen));
SwingUtilities.getWindowAncestor(EmielGui.this).pack();
} else {
((Timer) e.getSource()).stop();
}
}
}).start();
}
private static void createAndShowGui() {
EmielGui mainPanel = new EmielGui();
JFrame frame = new JFrame("EmielGui");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}