如何解决有没有办法在 GridBagLayout 的开头放置具有不同空间的 JButton?
我正在尝试做这样的事情:
但我不能在按钮前留空格。我尝试添加隐形按钮,但没有任何改变。
for (int i = 0; i < gameSize; i++ ){
c.gridwidth = (i+1)*2;
c.gridx = 0;
c.gridy = 4*i;
JRadioButton temp = new JRadioButton();
temp.setVisible(false);
board.add(temp,c);
for(int j = 0; j < gameSize; j++){
c.gridwidth = 4;
c.gridx = 2+(4*j);
c.gridy = 2+(4*i);
cells[i][j] = new JButton();
cells[i][j].setBackground(Color.white);
board.add(cells[i][j],c);
}
}
看起来像[这个:
当我让它们可见时。我不明白为什么它们的宽度仍然是 4,即使我将它分配给 (i+1)*2。
我是 Java 新手,也是 Java GUI 的新手。所以,也许我没有弄清楚最基本的事情。谢谢指教!
解决方法
我创建了以下 GUI。
为了做到这一点,我不得不结合使用 Swing 布局。
每行上的按钮都是在带有 JPanel
的 GridLayout
中创建的。该行是使用带有 JPanel
的行 FlowLayout
创建的,使用虚拟 JLabel
和按钮行 JPanel
。
主 JPanel
使用 (0,1) 的 GridLayout
来创建交错效果。每行中的虚拟 JLabel
变大 JButtons
大小的一半。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GridBagLayoutStaggeredGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new GridBagLayoutStaggeredGUI());
}
@Override
public void run() {
JFrame frame = new JFrame("Staggered Layout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel(),BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
int gameSize = 8;
int buttonSize = 50;
int inset = 2;
JButton[][] cells = new JButton[gameSize][gameSize];
JPanel panel = new JPanel(new GridLayout(0,1));
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
for (int i = 0; i < gameSize; i++) {
JPanel innerPanel = new JPanel(
new FlowLayout(FlowLayout.LEADING,0));
JLabel label = new JLabel();
label.setPreferredSize(new Dimension(inset,buttonSize));
innerPanel.add(label);
innerPanel.add(createRowPanel(cells[i],buttonSize));
panel.add(innerPanel);
inset += buttonSize / 2;
}
return panel;
}
private JPanel createRowPanel(JButton[] cells,int buttonSize) {
JPanel panel = new JPanel(new GridLayout(0,cells.length,0));
for (int i = 0; i < cells.length; i++) {
cells[i] = new JButton();
cells[i].setBackground(Color.white);
cells[i].setPreferredSize(new Dimension(buttonSize,buttonSize));
panel.add(cells[i]);
}
return panel;
}
}
,
GridBagLayout
只能计算列的宽度,前提是该列中添加了一个“gridwidth”为 1 的组件。
在您的示例中,您有 6 个按钮,每个按钮的“网格宽度”为 2,这意味着您确实需要 12 列。但是每列的宽度应该是多少?
下面的例子展示了如何为每一列分配一个最小宽度。现在 12 列中的每一列都将具有基于指定值的最小宽度。
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class GridBagLayoutMRE extends JPanel
{
public GridBagLayoutMRE()
{
int gameSize = 6;
int columnsNeeded = (gameSize * 3);
int cellSize = 30;
Dimension buttonSize = new Dimension(cellSize * 2,cellSize);
GridBagLayout gbl = new GridBagLayout();
setLayout( gbl );
int[] columnWidths = new int[columnsNeeded];
Arrays.fill(columnWidths,cellSize);
gbl.columnWidths = columnWidths;
GridBagConstraints gbc = new GridBagConstraints();
for (int i = 0; i < gameSize; i++)
{
gbc.gridx = 0;
gbc.gridy = i;
gbc.gridwidth = 1;
JRadioButton rb = new JRadioButton();
rb.setPreferredSize( new Dimension(60,cellSize) );
add(rb,gbc);
gbc.gridx = i + 1;
gbc.gridwidth = 2;
for (int j = 0; j < gameSize; j++)
{
JButton button = new JButton();
button.setPreferredSize( buttonSize );
add(button,gbc);
gbc.gridx = gbc.gridx + gbc.gridwidth;
}
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("GridBagLayoutMRE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout( new GridBagLayout() );
frame.add(new GridBagLayoutMRE());
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。