Java 边框布局不';不尊重最大尺寸
我在使用Java 边框布局不';不尊重最大尺寸,java,swing,layout,layout-manager,boxlayout,Java,Swing,Layout,Layout Manager,Boxlayout,我在使用BorderLayout时遇到问题,但首先,这里是我的GUI设置: 如您所见,我的JFrame中有3个不同的组件。添加JMenu和JList效果很好。但是我的JPanel应该有一个固定大小,因此我想防止我的BorderLayout拉伸面板。我尝试了一切,setPreferredSize()setMinimumSize()setMaximumSize()setSize(),但布局再次拉伸我的面板以适合框架。(使用BorderLayout.CENTER将面板添加到框架中) 有什么方法可以防
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
添加到中心面板
,该面板具有自定义的preferrdSize
。这样面板就不会拉伸
代码:
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();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JPanel;
公开课范例{
公共示例(){
JMenuBar menuBar=新的JMenuBar();
menuBar.setBorder(BorderFactory.CreateMateBorder(0,0,1,0,Color.BLACK));
DefaultListModel listModel=新的DefaultListModel();
JList list=新的JList(listModel);
setboorder(BorderFactory.createMatteBorder(0,0,0,1,Color.BLACK));
JPanel面板=新的JPanel(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
//如果您还想阻止
//面板的“包装”。
/*
*@Override public Dimension getMinimumSize(){return new
*维数(400400);}
*/
};
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
panel.setOrder(BorderFactory.createLineBorder(Color.BLUE));
对于(int i=1;i我很确定您的意思是BorderLayout
,而不是BoxLayout
,因为没有BoxLayout.CENTER
,看起来您使用BorderLayout
来放置组件
我认为这里的问题是,您只设置添加到BorderLayout.CENTER
的面板的首选大小。这没有任何效果。相反,您需要嵌套布局
在本例中,我添加了名为centerPanel
的JPanel
,该面板使用标准的GridBagLayout
(以使添加的组件居中),添加到BorderLayout.CENTER
。然后,我将另一个名为panel
的JPanel
添加到centerPanel
。这样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();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JPanel;
公开课范例{
公共示例(){
JMenuBar menuBar=新的JMenuBar();
menuBar.setBorder(BorderFactory.CreateMateBorder(0,0,1,0,Color.BLACK));
DefaultListModel listModel=新的DefaultListModel();
JList list=新的JList(listModel);
setboorder(BorderFactory.createMatteBorder(0,0,0,1,Color.BLACK));
JPanel面板=新的JPanel(){
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
//如果您还想阻止
//面板的“包装”。
/*
*@Override public Dimension getMinimumSize(){return new
*维数(400400);}
*/
};
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
panel.setOrder(BorderFactory.createLineBorder(Color.BLUE));
对于(int i=1;i将现有的JPanel
添加到JPanel
具有Flowlayout
、默认值或具有GridBagLayout
默认约束的JPanel。将此面板添加到框架的中心,BorderLayout.center
Panel centerPane = new Panel(new GridBagLayout())`;
centerPane.add(yourJPanel);
frame.add(centerPane, BorderLayout.CENTER);
也可以考虑使用<代码> box <代码>,而不是<代码> jPuth<代码> < <代码> BoxLayout < /C> > < /P>
还考虑使用框架<代码> StjMunuBar()/<代码>,而不是<代码>添加(BoDeDayStay.PaGyStEnter)
将现有的JPanel
添加到一个JPanel
具有默认的Flowlayout
,或具有默认约束的GridBagLayout
。将此面板添加到框架的中心,默认情况下,BorderLayout.center
Panel centerPane = new Panel(new GridBagLayout())`;
centerPane.add(yourJPanel);
frame.add(centerPane, BorderLayout.CENTER);