Java 使用GridBagLayout构建垄断板
我在业余时间一直在构建垄断的Java版本,在理解Swing的布局等方面遇到了一些困难 我在电路板上的每一个空格本质上都是一个自定义的Java 使用GridBagLayout构建垄断板,java,swing,layout,layout-manager,Java,Swing,Layout,Layout Manager,我在业余时间一直在构建垄断的Java版本,在理解Swing的布局等方面遇到了一些困难 我在电路板上的每一个空格本质上都是一个自定义的JButton,我一直试图将它们放在一个框架的边缘(就像在垄断电路板上一样)。我似乎找不到一个关于布局系统如何工作的有用解释,所以我很难做到这一点 有没有人能给我举个例子,说明他们是如何把按钮放在相框边缘的?我应该使用不同的布局吗?如果您将“内部”单元格留空,标准可能会起到作用。这似乎最适合使用标准。我建议创建4个JPanels,其中包含所有JButtons 然后将
JButton
,我一直试图将它们放在一个框架的边缘(就像在垄断电路板上一样)。我似乎找不到一个关于布局系统如何工作的有用解释,所以我很难做到这一点
有没有人能给我举个例子,说明他们是如何把按钮放在相框边缘的?我应该使用不同的布局吗?如果您将“内部”单元格留空,标准可能会起到作用。这似乎最适合使用标准。我建议创建4个
JPanel
s,其中包含所有JButton
s
然后将JPanels
添加到BorderLayout.North
、South
、East
和West
在我看来,这可能是最简单的按钮布局方式
是开始使用边框布局
的好地方
我刚刚拼凑了一些代码,可能会帮助您开始设计。它还没有被编译
可以想象,您可以用netbeans之类的东西设计布局,然后使用自动生成的代码(它从您构建的设计中生成间距)来布局您自己的电路板,只需复制自动生成的代码并替换为自定义按钮,而不必使用任何用作占位符的元素
这将允许您根据相对间距准确地将内容放置在您想要的位置,而不是试图让swing计算出来。我知道这已经得到了回答,但我觉得您应该看看GridLayout是如何工作的。首先,帮助破译长而神秘的方法签名 这个垄断委员会的例子有三个主要部分。有布局的设置,大的中间部分作为一个JPanels的添加,以及外部正方形作为JPanels的添加
public class GridBagLayoutExample extends JFrame {
public static void main(String[] args) {
new GridBagLayoutExample().setVisible(true);
}
public GridBagLayoutExample() {
try {
//Setup the Layout
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridBagLayout thisLayout = new GridBagLayout();
thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
getContentPane().setLayout(thisLayout);
//Default Grid values
int gridX = 0;
int gridY = 0;
//Add Panels for Each of the four sides
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 13; i++) {
JPanel tempPanel = new JPanel();
switch(j)
{
case 0://Top Spaces
gridX = i;
gridY = 0;
break;
case 1://Left Spaces
gridX = 0;
gridY = i;
break;
case 2://Right Spaces
gridX = 12;
gridY = i;
break;
case 3://Bottom Spaces
gridX = i;
gridY = 12;
break;
}
getContentPane().add(tempPanel,
new GridBagConstraints(gridX,// XGridSpot
gridY,// YGridSpot
1,// XGridSpaces
1,// YGridSpaces
0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,//Fill
new Insets(0, 0, 0, 0), 0, 0));
tempPanel.setBorder(BorderFactory
.createLineBorder(Color.BLACK));
}
}
{// Main Inner Area Notice Starts at (1,1) and takes up 11x11
JPanel innerPanel = new JPanel();
getContentPane().add(
innerPanel,
new GridBagConstraints(1,
1,
11,
11,
0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
pack();
setSize(260, 260);
} catch (Exception e) {
e.printStackTrace();
}
}
}
公共类GridBagLayoutExample扩展了JFrame{
公共静态void main(字符串[]args){
新建GridBagLayoutExample().setVisible(true);
}
public GridBagLayoutExample(){
试一试{
//设置布局
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridBagLayout thisLayout=新的GridBagLayout();
thisLayout.rowWeights=新的双精度[]{0.2,0.1,0.1,0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
thisLayout.columnWeights=新的双精度[]{0.2,0.1,0.1,0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
getContentPane().setLayout(thisLayout);
//默认网格值
int gridX=0;
int gridY=0;
//为四个侧面中的每一侧添加面板
对于(int j=0;j<4;j++){
对于(int i=0;i<13;i++){
JPanel tempanel=新的JPanel();
开关(j)
{
案例0://顶部空格
gridX=i;
gridY=0;
打破
案例1://左空格
gridX=0;
gridY=i;
打破
案例2://右空格
gridX=12;
gridY=i;
打破
案例3://底部空间
gridX=i;
gridY=12;
打破
}
getContentPane().add(临时面板,
新的GridBagConstraints(gridX,//XGridSpot
格里迪,//YGridSpot
1,//XGridSpaces
1,//YGridSpaces
0.0,0.0,GridBagConstraints.CENTER,
GridBagConstraints.BOTH,//Fill
新插入(0,0,0,0,0,0),0,0);
tempPanel.setOrder(边界工厂)
.createLineBorder(颜色.黑色));
}
}
{//主要内部区域通知从(1,1)开始,占11x11
JPanel innerPanel=新的JPanel();
getContentPane().add(
内面板,
新的限制条件(1,
1.
11,
11,
0.0, 0.0,
gridbag.CENTER,
两个都是,
新插入(0,0,0,0,0,0),0,0);
}
包装();
设置大小(260260);
}捕获(例外e){
e、 printStackTrace();
}
}
}
从这里开始,如果您添加一个结构来容纳面板,然后您可以向每个面板添加按钮和任何您想要的内容。按钮也可以代替面板工作。这应该使用正确的导入进行编译,所以请编译并试用。我不知道这是可能的。。。如何使单元格保持空?只需添加空容器,如
newjpanel()
或newjlabel()
空?不在我的董事会上。免费停车,社区胸和其他卡-那些是在中间板为我。谢谢投票和接受。希望我能帮忙。非常感谢。这就解释了这些东西的工作方式,很好的例子。不过你来的太晚了<代码>:(
public class GridBagLayoutExample extends JFrame {
public static void main(String[] args) {
new GridBagLayoutExample().setVisible(true);
}
public GridBagLayoutExample() {
try {
//Setup the Layout
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridBagLayout thisLayout = new GridBagLayout();
thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
getContentPane().setLayout(thisLayout);
//Default Grid values
int gridX = 0;
int gridY = 0;
//Add Panels for Each of the four sides
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 13; i++) {
JPanel tempPanel = new JPanel();
switch(j)
{
case 0://Top Spaces
gridX = i;
gridY = 0;
break;
case 1://Left Spaces
gridX = 0;
gridY = i;
break;
case 2://Right Spaces
gridX = 12;
gridY = i;
break;
case 3://Bottom Spaces
gridX = i;
gridY = 12;
break;
}
getContentPane().add(tempPanel,
new GridBagConstraints(gridX,// XGridSpot
gridY,// YGridSpot
1,// XGridSpaces
1,// YGridSpaces
0.0, 0.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH,//Fill
new Insets(0, 0, 0, 0), 0, 0));
tempPanel.setBorder(BorderFactory
.createLineBorder(Color.BLACK));
}
}
{// Main Inner Area Notice Starts at (1,1) and takes up 11x11
JPanel innerPanel = new JPanel();
getContentPane().add(
innerPanel,
new GridBagConstraints(1,
1,
11,
11,
0.0, 0.0,
GridBagConstraints.CENTER,
GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
pack();
setSize(260, 260);
} catch (Exception e) {
e.printStackTrace();
}
}
}