2 回答

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
盡管我在 3 列中有 3 個(gè)組件,但出于某種原因,前兩個(gè)組件放在同一列中
實(shí)際上,從 GridBagLayout 的角度來看,您只有兩列。
gbc.gridwidth = 3;
當(dāng)您使用gridWidth
約束時(shí),您是在說您沒有特定的列,因?yàn)樗鼘⒄加?3 列的空間(假設(shè)您實(shí)際上有 3 列,但您沒有)。由于您只有 2 個(gè)網(wǎng)格寬度為 1 的組件,因此您實(shí)際上只有 2 列。
那就是第一列沒有唯一的寬度(因?yàn)樘砑拥降谝涣械奈ㄒ唤M件跨越多列),那么第二列應(yīng)該從哪里開始呢?
為了演示這一點(diǎn),請將您的代碼更改為僅使用gridx
和gridy
約束。
然后您將在 3 行的 3 列中看到 3 個(gè)組件。
接下來,添加回:
gbc.gridwidth = 3;
對于“標(biāo)簽”。
然后您將在一列中看到所有 3 個(gè)組件。這是因?yàn)?3 的網(wǎng)格寬度也將用于“開始”按鈕。所以實(shí)際上“標(biāo)簽”和“開始”組件沒有唯一的列,所以只有“顏色”有一個(gè)定義的列,所以你有一個(gè)只有一列的網(wǎng)格。
接下來,添加回:
gbc.gridwidth = 1;
對于“開始”按鈕。
然后您將看到按鈕的兩列,標(biāo)簽將跨越兩列。這是因?yàn)椤伴_始”和“顏色”具有唯一的列,而“標(biāo)簽”只能跨越 2 列(即使您要求它跨越 3 列)。
我不確定你想要完成的確切布局,所以我不能給出建議的解決方案,但希望你能理解為什么你真的只有 2 列,而不是 3 列。
請注意,作為 hack,您可以在第一列中添加一個(gè)虛擬組件,然后標(biāo)簽可以跨越 3 列。虛擬組件類似于:
JLabel filler = new JLabel(""); gbc.gridheight = 1; gbc.gridwidth = 1; gbc.gridx = 0; gbc.gridy = 1; game_name.setPreferredSize(new Dimension(100, 30)); startScreen.add(filler, gbc);

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
GridBagLayouts 和 GridBagConstrains 就像 excel 表一樣工作。有列和行,您可以在其中以水平和垂直方式放置組件。您還可以合并布局等。
據(jù)我了解你的情況,你有 3 個(gè)組件要放在 3 列中。
組件在布局中的位置由特定組件 GridBagConstraints 的gridx和gridy值決定
因此,在您的情況下,每個(gè)組件都應(yīng)該具有以下值;
對于colorbutton,gridx = 0 和 gridy = 0
對于游戲名稱,gridx = 1 和 gridy = 0
對于開始,gridx = 2 和 gridy = 0
所以所有 3 個(gè)組件將分布在同一行 (gridy) 和 3 個(gè)不同的列 (gridx)
gridwidth確定您是否要合并任何列。在您的例子中,您將 gridwidth 用作 game_name 標(biāo)簽的 3。因此,您要為此標(biāo)簽合并 3 列。
因此,您的 gridx 值也應(yīng)該更改以支持合并,如下所示;
對于colorbutton,gridx = 0 和 gridy = 0
對于游戲名稱,gridx = 1 和 gridy = 0
對于開始,gridx = 4 和 gridy = 0
您可以通過使用我的第一個(gè) x 和 y 值將網(wǎng)格寬度更改為 1 來獲得相同的輸出
以下將是更正后的代碼;
// Frame Setup
JFrame frame = new JFrame("GridBagLayout_Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(Color.CYAN);
frame.setLocation(550, 250);
frame.setSize(800, 550);
JPanel startScreen = new JPanel(new GridBagLayout());
startScreen.setBackground(Color.BLACK);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
JButton colorbutton = new JButton("Color");
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbc.gridx = 0; // change
gbc.gridy = 0;
colorbutton.setPreferredSize(new Dimension(100, 30));
startScreen.add(colorbutton, gbc);
JLabel game_name = new JLabel("LABEL");
gbc.gridheight = 1;
gbc.gridwidth = 3;
gbc.gridx = 1; // change
gbc.gridy = 0; // change
game_name.setBackground(Color.ORANGE);
game_name.setOpaque(true);
game_name.setPreferredSize(new Dimension(100, 30));
startScreen.add(game_name, gbc);
JButton start = new JButton("START");
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbc.gridx = 4; // change
gbc.gridy = 0; // change
start.setPreferredSize(new Dimension(100, 30));
startScreen.add(start, gbc);
// Show Results
frame.add(startScreen);
frame.setVisible(true);
添加回答
舉報(bào)