Java BorderLayout,GridLayout,GridBagLayout?我应该用哪一种?
我正在尝试创建此基本GUI,但无法正确设置面板。(数字为像素大小) 我曾尝试将本教程用作参考(),但我的教程从来没有这样做过 我的代码在类的顶部声明变量,然后创建一个构造函数来添加组件(面板、按钮等),然后在main方法中调用构造函数Java BorderLayout,GridLayout,GridBagLayout?我应该用哪一种?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在尝试创建此基本GUI,但无法正确设置面板。(数字为像素大小) 我曾尝试将本教程用作参考(),但我的教程从来没有这样做过 我的代码在类的顶部声明变量,然后创建一个构造函数来添加组件(面板、按钮等),然后在main方法中调用构造函数 import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import jav
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
公共类最终项目扩展JPanel
{
}
我该怎么做才能让这个布局正确呢?面板中的面板、相互独立的面板等?
GridLayout
我从未实际使用过,但我不确定它是否可以做到这一点
BorderLayout
可以做到这一点,并且比gridbagloayout
更简单
GridBagLayout
可以做到这一点
总的来说,GridBagLayout
是最灵活的LayoutManager
之一,非常值得学习,因此我建议在您需要它处理更复杂的事情之前,在这里使用它来适应简单的情况
如果您熟悉HTML,那么可以将GridBagLayout
想象为与HTML表类似的工作方式
非常快-创建三个面板,并在其中设置大小/边框/您需要的任何内容
在单元格0,0中添加一个colspan为2的值。
在单元格1,0中添加一个
在单元格1,1中添加一个
完成后,尽管您可能希望指定resize/anchor/etc行为。不,不要为此使用GridBagLayout,因为这样会增加比实际需要更多的复杂性。就我自己而言,我尽量避免使用这种布局及其所有潜在的陷阱,通常通过嵌套JPanel,每个都使用自己更简单的布局,您可以得到所需的一切。例如,在这里,您只需要一个边界布局:
- 将顶部JPanel放置在BorderLayout.NORTH位置
- 将左侧JPanel置于BorderLayout.WEST位置
- 将中心JPanel放置在BorderLayout.center位置李>
编辑
请注意,JFrame上没有显示任何内容,因为您没有将JPanel添加到JFrame
编辑2
例如:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.*;
public class SimpleLayout {
private static final Color GREEN = new Color(200, 255, 200);
private static final Color BLUE = new Color(200, 200, 255);
private static void createAndShowGui() {
JFrame frame = new JFrame("SimpleLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// note that a JFrame's contentPane uses BorderLayout by default
frame.getContentPane().add(new ColorPanel(Color.pink, 800, 80), BorderLayout.NORTH);
frame.getContentPane().add(new ColorPanel(GREEN, 300, 420), BorderLayout.WEST);
frame.getContentPane().add(new ColorPanel(BLUE, 500, 420), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class ColorPanel extends JPanel {
private static final float FONT_POINTS = 24f;
private int prefW;
private int prefH;
public ColorPanel(Color color, int prefW, int prefH) {
setBackground(color);
this.prefW = prefW;
this.prefH = prefH;
// GBL can be useful for simply centering components
setLayout(new GridBagLayout());
String text = String.format("%d x %d", prefW, prefH);
JLabel label = new JLabel(text, SwingConstants.CENTER);
label.setFont(label.getFont().deriveFont(FONT_POINTS));
label.setForeground(Color.gray);
add(label);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(prefW, prefH);
}
}
这显示为:
我的建议:您最需要的是一个BorderLayout,但话虽如此,我的主要建议是让您尝试一下,然后在仍然有问题的情况下显示代码。否则,我们很难猜到您可能做错了什么。我已经发布了我的代码:)您只添加了一个按钮…尝试添加其他按钮,一个在北方,一个在中间。。。。。。。。。。。。。。。。。。。更好的尝试我有点熟悉GridBagLayout和约束。你知道如何让3个面板按照我希望的方式与适当的约束对齐吗?css确实浮动:左,gridbag中是否有类似的内容?我将添加一个非常快速的摘要。我在上面发布了一个更新。我的框架上没有显示任何内容,我想我的gridx和gridy设置已经接近了。@MikeMilla:你没有将你的JPanel添加到JFrame中。我用gridbag添加了它们,但仍然很混乱。。。只看到蓝色。我添加了它们,但现在一切都是蓝色的。我尝试过这种边界布局,但用gridbag我至少可以看到一些东西。哇,谢谢。获取标签名称的非常聪明的方法。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.*;
public class SimpleLayout {
private static final Color GREEN = new Color(200, 255, 200);
private static final Color BLUE = new Color(200, 200, 255);
private static void createAndShowGui() {
JFrame frame = new JFrame("SimpleLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// note that a JFrame's contentPane uses BorderLayout by default
frame.getContentPane().add(new ColorPanel(Color.pink, 800, 80), BorderLayout.NORTH);
frame.getContentPane().add(new ColorPanel(GREEN, 300, 420), BorderLayout.WEST);
frame.getContentPane().add(new ColorPanel(BLUE, 500, 420), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class ColorPanel extends JPanel {
private static final float FONT_POINTS = 24f;
private int prefW;
private int prefH;
public ColorPanel(Color color, int prefW, int prefH) {
setBackground(color);
this.prefW = prefW;
this.prefH = prefH;
// GBL can be useful for simply centering components
setLayout(new GridBagLayout());
String text = String.format("%d x %d", prefW, prefH);
JLabel label = new JLabel(text, SwingConstants.CENTER);
label.setFont(label.getFont().deriveFont(FONT_POINTS));
label.setForeground(Color.gray);
add(label);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(prefW, prefH);
}
}