BorderLayout 不支持最大尺寸
BorderLayout doesn't honor maximumsize
我在使用 BorderLayout
时遇到问题,但首先,这是我的 GUI 设置:
如您所见,我的 JFrame
内有 3 个不同的组件。添加 JMenu
和 JList
效果很好。但是我的 JPanel
应该有一个 固定大小 所以我想防止我的 BorderLayout
拉伸面板。我尝试了一切,setPreferredSize() setMinimumSize() setMaximumSize() setSize()
但布局再次拉伸我的面板以适应框架。 (使用 BorderLayout.CENTER
将面板添加到框架中)。
有什么方法可以防止这种情况发生,或者您有其他解决问题的建议吗?
我很确定你的意思是 BorderLayout
,而不是 BoxLayout
,因为没有 BoxLayout.CENTER
,而且看起来你使用 BorderLayout
来放置组件.
我认为这里的问题是您只设置了添加到 BorderLayout.CENTER
的面板的首选大小。这没有任何作用。相反,您需要嵌套布局。
在此示例中,我将名为 centerPanel
的 JPanel
添加到 BorderLayout.CENTER
,它使用标准 GridBagLayout
(将添加的组件居中)。然后我将另一个名为 panel
的 JPanel
添加到 centerPanel
,它有一个自定义的 preferrdSize
。这样 panel
就不会被拉长。
代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
public class Example {
public Example() {
JMenuBar menuBar = new JMenuBar();
menuBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
DefaultListModel<String> listModel = new DefaultListModel<String>();
JList<String> list = new JList<String>(listModel);
list.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
// Uncomment the following lines if you also want to prevent the
// 'wrapping' of the panel.
/*
* @Override public Dimension getMinimumSize() { return new
* Dimension(400, 400); }
*/
};
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
for (int i = 1; i <= 5; i++) {
menuBar.add(new JMenu("Menu " + i));
listModel.addElement("Element " + i);
panel.add(new JLabel("Label " + i));
}
JPanel centerPanel = new JPanel(new GridBagLayout());
centerPanel.add(panel);
JPanel contentPanel = new JPanel(new BorderLayout());
contentPanel.add(menuBar, BorderLayout.NORTH);
contentPanel.add(list, BorderLayout.WEST);
contentPanel.add(centerPanel);
JFrame frame = new JFrame();
frame.setContentPane(contentPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}
将您现有的 JPanel
添加到具有 Flowlayout
默认值或具有默认约束的 GridBagLayout
的 JPanel
。将此面板添加到框架的中心,默认为 BorderLayout.CENTER
。
Panel centerPane = new Panel(new GridBagLayout())`;
centerPane.add(yourJPanel);
frame.add(centerPane, BorderLayout.CENTER);
也可以考虑使用 Box
,而不是具有 BoxLayout
的 JPanel
。
也可以考虑使用框架的 setJMenuBar()
,而不是 add(BorderLayout.PAGE_START)
。
我在使用 BorderLayout
时遇到问题,但首先,这是我的 GUI 设置:
如您所见,我的 JFrame
内有 3 个不同的组件。添加 JMenu
和 JList
效果很好。但是我的 JPanel
应该有一个 固定大小 所以我想防止我的 BorderLayout
拉伸面板。我尝试了一切,setPreferredSize() setMinimumSize() setMaximumSize() setSize()
但布局再次拉伸我的面板以适应框架。 (使用 BorderLayout.CENTER
将面板添加到框架中)。
有什么方法可以防止这种情况发生,或者您有其他解决问题的建议吗?
我很确定你的意思是 BorderLayout
,而不是 BoxLayout
,因为没有 BoxLayout.CENTER
,而且看起来你使用 BorderLayout
来放置组件.
我认为这里的问题是您只设置了添加到 BorderLayout.CENTER
的面板的首选大小。这没有任何作用。相反,您需要嵌套布局。
在此示例中,我将名为 centerPanel
的 JPanel
添加到 BorderLayout.CENTER
,它使用标准 GridBagLayout
(将添加的组件居中)。然后我将另一个名为 panel
的 JPanel
添加到 centerPanel
,它有一个自定义的 preferrdSize
。这样 panel
就不会被拉长。
代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
public class Example {
public Example() {
JMenuBar menuBar = new JMenuBar();
menuBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
DefaultListModel<String> listModel = new DefaultListModel<String>();
JList<String> list = new JList<String>(listModel);
list.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
// Uncomment the following lines if you also want to prevent the
// 'wrapping' of the panel.
/*
* @Override public Dimension getMinimumSize() { return new
* Dimension(400, 400); }
*/
};
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
for (int i = 1; i <= 5; i++) {
menuBar.add(new JMenu("Menu " + i));
listModel.addElement("Element " + i);
panel.add(new JLabel("Label " + i));
}
JPanel centerPanel = new JPanel(new GridBagLayout());
centerPanel.add(panel);
JPanel contentPanel = new JPanel(new BorderLayout());
contentPanel.add(menuBar, BorderLayout.NORTH);
contentPanel.add(list, BorderLayout.WEST);
contentPanel.add(centerPanel);
JFrame frame = new JFrame();
frame.setContentPane(contentPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}
将您现有的 JPanel
添加到具有 Flowlayout
默认值或具有默认约束的 GridBagLayout
的 JPanel
。将此面板添加到框架的中心,默认为 BorderLayout.CENTER
。
Panel centerPane = new Panel(new GridBagLayout())`;
centerPane.add(yourJPanel);
frame.add(centerPane, BorderLayout.CENTER);
也可以考虑使用 Box
,而不是具有 BoxLayout
的 JPanel
。
也可以考虑使用框架的 setJMenuBar()
,而不是 add(BorderLayout.PAGE_START)
。