Java 使用JPanels设置布局
我在Java中根本没有使用Swing。我正在用它做实验。我想做一个不能改变大小的布局。我看到很多建议使用Java 使用JPanels设置布局,java,swing,jframe,jpanel,null-layout-manager,Java,Swing,Jframe,Jpanel,Null Layout Manager,我在Java中根本没有使用Swing。我正在用它做实验。我想做一个不能改变大小的布局。我看到很多建议使用layoutmanagers将多个jpanel添加到JFrame 然而,我看到的所有涉及布局管理器的教程都说,它允许用户调整屏幕大小。我想要的布局有一个沿着左手边的矩形,一个沿着底部的薄矩形,第三个矩形占据了剩余的空间。我尝试使用绝对布局,但它不想为我工作 import java.awt.Color; import javax.swing.JFrame; import javax.swing
layoutmanagers
将多个jpanel
添加到JFrame
然而,我看到的所有涉及布局管理器的教程都说,它允许用户调整屏幕大小。我想要的布局有一个沿着左手边的矩形,一个沿着底部的薄矩形,第三个矩形占据了剩余的空间。我尝试使用绝对布局,但它不想为我工作
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test extends JFrame {
public Test() {
JPanel rect1 = new JPanel();
rect1.setBounds(101, 650, 900, 50);
rect1.setBackground(Color.RED);
getContentPane().add(rect1);
JPanel rect2 = new JPanel();
rect2.setBounds(0, 650, 100, 1000);
rect2.setBackground(Color.BLUE);
getContentPane().add(rect2);
JPanel rect3 = new JPanel();
rect3.setBounds(101, 700, 900, 950);
rect3.setBackground(Color.GREEN);
getContentPane().add(rect3);
setTitle("TEST");
setSize(1000, 700);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test ex = new Test();
ex.setVisible(true);
}
});
}
}
有人能帮我在这个布局的Jframe中正确地制作三个JPanel吗(都有不同的颜色)?您可以使用setResizeable()。请参考下面的代码片段
setResizable(false); // this will not allow resizing
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
AbsoluteLayout
是不可能的。不要那样做。您可能正在查找BorderLayout
。查看教程:了解详细信息。如果您不希望您的JFrame
能够重新调整大小,请使用frame.setresizeable(false)代码>在它上面。使用边框布局作为基础,甚至网格布局
也可以实现同样的效果
您缺少的主要内容是布局管理器使用(或可以根据布局管理器使用)组件的首选/最小/最大尺寸
基本上,您要做的是定义一个自定义组件(从像JPanel
这样的东西扩展)并覆盖它的getPreferredSize
方法并返回所需的值。根据布局管理器的不同,您可能还需要覆盖getMaximumSize
和getMinimumSize
方法
例如
基本上,这显示了“默认”大小以及调整屏幕大小时发生的情况
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 javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FixedSizeLayout {
public static void main(String[] args) {
new FixedSizeLayout();
}
public FixedSizeLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(new ContentPane(), gbc);
gbc.gridx++;
add(new LeftPane(), gbc);
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = 1;
add(new BottomPane(), gbc);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ContentPane extends JPanel {
public ContentPane() {
setBackground(Color.GREEN);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 150);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}
public class BottomPane extends JPanel {
public BottomPane() {
setBackground(Color.RED);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 50);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}
public class LeftPane extends JPanel {
public LeftPane() {
setBackground(Color.BLUE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 150);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}
}
现在,如果你愿意的话,你可以让屏幕不可调整大小,但我不喜欢你。我更喜欢使用版面管理器的功能,允许用户决定如何查看内容。。。在那里我可以。。。但这只是我的问题(我不喜欢不可调整大小的窗口,除了某些对话框)只需使用简单的BorderLayout
即可自动调整大小:
JPanel panel = new JPanel(new BorderLayout());
panel.add(greenPanel, BorderLayout.CENTER);
panel.add(redPanel, BorderLayout.SOUTH);
panel.add(bluePanel, BorderLayout.EAST);
您可以使用MigLayout并将BorderLayout.CENTER替换为“停靠中心”:
在此处阅读有关MigLayout的更多信息:回答我1个问题。你什么时候睡觉?现在,我真的很难过,因为我不能把问题贴出来,这样我就可以投票接受答案了P.无论如何,接受挑战。:)@sage会一如既往地提供高质量的答案;)
JPanel panel = new JPanel(new MigLayout(" insets 0"));
panel.add(greenPanel, "dock center");
panel.add(redPanel, "dock south");
panel.add(bluePanel, "dock east");