不允许添加组件来调整 JPanel 的大小
Not allow the adding components to resize a JPanel
我有一个使用 GridBagLayout 布局的 parent JPanel parentPanel。在这些面板中,我还有另外 3 个 child JPanels("childPanel1", "childPanel2", "childPanel3")
,如下所示:
_____ _____
| | 2 |
| 1 |_____|
| | 3 |
|_____|_____|
我在 BorderLayout.CENTER 的固定大小的 JFrame 中添加了 panelParent,我希望框架保持固定(不可调整大小),600 x 400。
child 面板的宽度都相等,我希望它们 保持相等。
对于 child 面板,我也使用了 GridBagLayout。
我在 childPanel1 中安排了组件,宽度仍然相等。
问题:当我开始将组件添加到 childPanel2 时,它会调整自身和其他 2 个 childPanel 的大小。 child 面板宽度不再相等。 变成这样:
____ ______
| | 2 |
| 1 |______|
| | 3 |
|____|______|
我有两个问题,
- 添加后如何让 child 面板不可调整大小
组件放入其中,所有组件都具有相同的宽度?
- 面板的自动调整大小与JPanel有关,parent
布局,child 布局或组件属性?
我刚刚开始了解 Swing。
谢谢!
最简单(但可能不是最好)的方法可能是覆盖每个 child JPanel
:
的 getPreferredSize
方法
代码:
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.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Example {
public Example() {
JPanel parentPanel = new JPanel(new GridBagLayout());
parentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.gridheight = 2;
parentPanel.add(createChildPanel(1), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridheight = 1;
parentPanel.add(createChildPanel(2), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
parentPanel.add(createChildPanel(3), gbc);
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().add(parentPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JPanel createChildPanel(int number) {
JPanel panel = new JPanel(new BorderLayout()) {
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 150);
}
};
JPanel addPanel = new JPanel();
addPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY));
JButton addButton = new JButton("+");
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
addPanel.add(new JLabel("Label"));
addPanel.revalidate();
addPanel.repaint();
}
});
JButton deleteButton = new JButton("-");
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (addPanel.getComponentCount() > 0) {
addPanel.remove(addPanel.getComponent(addPanel.getComponentCount() - 1));
addPanel.revalidate();
addPanel.repaint();
}
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(addButton);
buttonPanel.add(deleteButton);
JLabel label = new JLabel(String.valueOf(number));
label.setHorizontalAlignment(JLabel.CENTER);
panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
panel.add(label, BorderLayout.NORTH);
panel.add(addPanel);
panel.add(buttonPanel, BorderLayout.SOUTH);
return panel;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}
我有一个使用 GridBagLayout 布局的 parent JPanel parentPanel。在这些面板中,我还有另外 3 个 child JPanels("childPanel1", "childPanel2", "childPanel3")
,如下所示:
_____ _____
| | 2 |
| 1 |_____|
| | 3 |
|_____|_____|
我在 BorderLayout.CENTER 的固定大小的 JFrame 中添加了 panelParent,我希望框架保持固定(不可调整大小),600 x 400。
child 面板的宽度都相等,我希望它们 保持相等。
对于 child 面板,我也使用了 GridBagLayout。
我在 childPanel1 中安排了组件,宽度仍然相等。
问题:当我开始将组件添加到 childPanel2 时,它会调整自身和其他 2 个 childPanel 的大小。 child 面板宽度不再相等。 变成这样:
____ ______
| | 2 |
| 1 |______|
| | 3 |
|____|______|
我有两个问题,
- 添加后如何让 child 面板不可调整大小 组件放入其中,所有组件都具有相同的宽度?
- 面板的自动调整大小与JPanel有关,parent 布局,child 布局或组件属性?
我刚刚开始了解 Swing。
谢谢!
最简单(但可能不是最好)的方法可能是覆盖每个 child JPanel
:
getPreferredSize
方法
代码:
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.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Example {
public Example() {
JPanel parentPanel = new JPanel(new GridBagLayout());
parentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.gridheight = 2;
parentPanel.add(createChildPanel(1), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridheight = 1;
parentPanel.add(createChildPanel(2), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
parentPanel.add(createChildPanel(3), gbc);
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().add(parentPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JPanel createChildPanel(int number) {
JPanel panel = new JPanel(new BorderLayout()) {
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 150);
}
};
JPanel addPanel = new JPanel();
addPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY));
JButton addButton = new JButton("+");
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
addPanel.add(new JLabel("Label"));
addPanel.revalidate();
addPanel.repaint();
}
});
JButton deleteButton = new JButton("-");
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (addPanel.getComponentCount() > 0) {
addPanel.remove(addPanel.getComponent(addPanel.getComponentCount() - 1));
addPanel.revalidate();
addPanel.repaint();
}
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(addButton);
buttonPanel.add(deleteButton);
JLabel label = new JLabel(String.valueOf(number));
label.setHorizontalAlignment(JLabel.CENTER);
panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
panel.add(label, BorderLayout.NORTH);
panel.add(addPanel);
panel.add(buttonPanel, BorderLayout.SOUTH);
return panel;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}