我正在尝试创建这个基本的GUI,但无法正确设置我的面板。(数字是像素大小)
我已尝试将此教程用作参考(http://www.youtube.com/watch?v=Kl3klve_rmQ),但我的工作从不相同。
我的代码在类的顶部声明变量,然后创建一个构造函数来添加组件(面板,按钮等),然后它在main方法中调用构造函数。
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;
公共类FinalProject扩展了JPanel {
private static final long serialVersionUID = 1L;
static JPanel nav;
static JPanel queue;
static JPanel menu;
GridBagConstraints gbc = new GridBagConstraints();
public FinalProject()
{
nav = new JPanel();
nav.setLayout(new GridBagLayout());
nav.setBackground(Color.RED);
gbc.gridy = 0;
gbc.gridx = 0;
gbc.gridheight = 1;
gbc.gridwidth = 1;
add(nav, gbc);
queue = new JPanel();
queue.setLayout(new GridBagLayout());
queue.setBackground(Color.GREEN);
gbc.gridy = 1;
gbc.gridx = 1;
gbc.gridheight = 1;
gbc.gridwidth = 1;
add(queue, gbc);
menu = new JPanel();
menu.setLayout(new GridBagLayout());
menu.setBackground(Color.BLUE);
gbc.gridy = 2;
gbc.gridx = 2;
gbc.gridheight = 1;
gbc.gridwidth = 1;
add(menu, gbc);
}
public static void main(String[] args)
{
FinalProject p = new FinalProject();
JFrame f = new JFrame();
f.add(nav);
f.add(queue);
f.add(menu);
f.setTitle("Subway");
f.setSize(800, 500);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setResizable(false);
f.add(p);
}
}
我应该如何正确地进行此布局?小组中的小组,小组彼此独立等等?
答案 0 :(得分:4)
不,不要使用GridBagLayout,因为您将增加比实际需要更多的复杂性。我自己,尽量避免使用这种布局及其所有潜在的陷阱,通常你可以通过嵌套JPanel来获得所需的一切,每个都使用自己更简单的布局。例如,您只需要一个BorderLayout:
那就是它。
再次,请查看Swing和布局管理器教程,因为信息很好地呈现在那里。
修改强>
请注意,您的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);
}
}
显示为:
答案 1 :(得分:2)
GridLayout
我从未真正使用过,但我不确定它是否可以这样做。
BorderLayout
可以执行此操作,并且比GridBagLayout
更易于使用。
GridBagLayout
可以做到这一点。
一般来说,GridBagLayout
是最灵活的LayoutManager
之一,非常值得学习,因此我建议您在此之前使用它来熟悉它,然后再根据需要进行操作无论如何,对于更复杂的事情。
如果您熟悉HTML,那么请将GridBagLayout
视为像HTML表一样工作。
非常快 - 创建三个面板并设置尺寸/边框/您需要的任何内容。
在单元格0,0中添加一个colspan为2。 在单元格1,0中添加一个 在单元格1,1中添加一个
之后你就完成了,尽管你可能想要指定resize / anchor / etc行为。