【发布时间】:2014-08-31 03:40:38
【问题描述】:
我正在使用 swing 来尝试制作一个垄断板。我正在尝试将板上的属性/空间设置为单独的 JPanel,它们可以有自己的实现、信息等,但是我在空间的形状上遇到了一些问题。我正在使用 GridBagLayout(我对这个布局管理器相当陌生),并且我正在尝试布置面板,以便对于侧面 JPanel,gridwidth = 4,gridheight = 3(参见附加代码)。但是,当我运行它并查看它时,面板是方形的。我确认当我将 gridheight 更改为 2 或 1 时这不起作用,它仍然显示为正方形(我希望 JPanel 的形状更加椭圆形)。
请原谅命名方案,我只是在 Eclipse 中的一个单独的临时项目文件中尝试此布局,然后在我的主要垄断程序中实现 gui。
import static java.awt.GridBagConstraints.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class MainFrame extends JFrame {
private static final long serialVersionUID = 1L;
public MainFrame() {
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension screenSize = getToolkit().getScreenSize();
setSize(screenSize.height, screenSize.height);
setLocationRelativeTo(null);
setLayout(new GridBagLayout());
addCorners();
addEdges();
setVisible(true);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Component resized");
int width = getWidth();
int height = getHeight();
System.out.println(width + " " + height);
super.componentResized(e);
}
});
}
private int startingColRow = 4;
private int endingColRow = 28;
private int bigWidth = 4;
private int smallWidth = 3;
private int startingEdge = 0;
private int endingEdge = 31;
private void addEdges() {
addLeftEdge();
addTopEdge();
addBottomEdge();
addRightEdge();
}
private void addCorners() {
addTopLeftCorner();
addBottomLeftCorner();
addTopRightCorner();
addBottomRightCorner();
}
private void addCorner(int anchor, int gridx, int gridy) {
add(getWhiteJPanel(), getGridBagConstraints(anchor, gridx, gridy, bigWidth, bigWidth));
}
private void addBottomRightCorner() {
addCorner(SOUTHEAST, endingEdge, endingEdge);
}
private void addTopRightCorner() {
addCorner(NORTHWEST, endingEdge, startingEdge);
}
private void addBottomLeftCorner() {
addCorner(SOUTHWEST, startingEdge, endingEdge);
}
private void addTopLeftCorner() {
addCorner(NORTHEAST, startingEdge, startingEdge);
}
public void addLeftEdge() {
for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(WEST, startingEdge, row, bigWidth, smallWidth));
}
}
public void addRightEdge() {
for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(EAST, endingEdge, row, bigWidth, smallWidth));
}
}
public void addBottomEdge() {
for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(SOUTH, col, endingEdge, smallWidth, bigWidth));
}
}
public void addTopEdge() {
for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
add(getWhiteJPanel(), getGridBagConstraints(NORTH, col, startingEdge, smallWidth, bigWidth));
}
}
private static JPanel getWhiteJPanel() {
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
return panel;
}
private GridBagConstraints getGridBagConstraints(int anchor, int gridx, int gridy, int gridwidth, int gridheight) {
GridBagConstraints c = new GridBagConstraints();
c.fill = VERTICAL;
c.weightx = c.weighty = 1;
c.anchor = anchor;
c.gridx = gridx;
c.gridy = gridy;
c.gridwidth = gridwidth;
c.gridheight = gridheight;
return c;
}
public static void main(String[] args) {
new MainFrame();
}
}
【问题讨论】:
-
为了尽快获得更好的帮助,请直接在问题中发布MCVE(最小完整和可验证示例)。外部链接过时了,大多数人不会关注它们。
-
源代码中的一个空白行总是就足够了。
{之后或}之前的空行通常也是多余的。 -
@Andrew:我不知道如何使这个示例成为 MCVE。另外,我知道一行就足够了,但是我试图跟上 Clean Code 的建议(书),即尽可能少地编写函数,我发现添加额外的空间(虽然对某些人来说很难看)对我有帮助挑出什么是函数,什么是成员,内部类等。下次我发布SO时我会更改格式。
标签: java swing layout-manager gridbaglayout