gpt4 book ai didi

java - 尝试在方格网格下方添加消息 JLabel 时,GridBagLayout 做奇怪的事情

转载 作者:行者123 更新时间:2023-12-01 09:58:05 26 4
gpt4 key购买 nike

我试图在显示的方 block 网格下方显示消息的JLabel(每个方 block 都是一个JLabel)。当我不尝试将消息添加到 JPanel 时,4x4 方 block 网格显示得很好。但是,当我尝试在网格下方或上方添加消息 JLabel 时,会发生的情况是,正方形网格被分成两部分(在第一列正方形之后),这样一列正方形左边显示,然后有一个间隙,然后显示其他三列方 block 。该消息显示在下方。为什么添加此消息会导致方格网格像这样 split ?我已将我的代码放在下面。预先感谢您的任何帮助。

public void displayGrid(JButton button) {

JLabel instructionsLabel = new JLabel ("Select the locations of the four objects that you saw previously. Be careful - when you select one box, you can't take it back.");

try {
squareImage = ImageIO.read(this.getClass().getResource("stimulus(0).gif"));

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(int i = 0; i < 16; i++){
c.gridx = i % 4;
c.gridy = i / 4;
squareLabels[i] = new JLabel(new ImageIcon(squareImage));
panel.add(squareLabels[i], c);
squareLabels[i].addMouseListener(this);
}

panel.validate();

c.gridy += 1;
c.gridx = 0;
panel.add(instructionsLabel, c);
panel.validate();
}

最佳答案

您正在添加您的 instructionsLabel到第五行第一列,在 4*4 矩阵 JLabel 之后s。

问题是因为你的instructionsLabel长度比你的 squareLabels[i] 长,因此默认行为 GridBagLayout将拉伸(stretch)第一列以适合 instructionsLabel .

您需要设置gridWidth为您GridBagConstraints对象c在添加 instructionsLabel 之前:

c.gridy += 1;
c.gridx = 0;
constraint.gridwidth = 4;
panel.add(instructionsLabel, c);

通过设置constraint.gridwidth = 4;您告诉布局管理器放置 instructionsLabel在不止一列中。 (这里我设置了正好4列。)

添加一些LineBorder给您JLabel s 将帮助您了解 GridBagLayout 的行为及其 Constraints更好。

[更新]您可以使用BorderLayout作为主布局,然后添加 JPanel与您的JLabel s 和其他组件到 BorderLayout 的中心。然后在那JPanel使用GridBagLayout 。请参阅此示例:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestGridBagLAyout extends JFrame {

private static final long serialVersionUID = -392403850862179703L;
private static final int FRAME_WIDTH = 200;
private static final int FRAME_HEIGHT = 200;

public TestGridBagLAyout() {
setSize(FRAME_WIDTH, FRAME_HEIGHT);
//
setForeground(Color.RED);
//
setLayout(new BorderLayout());
add(initCenterPanel());
}

private JPanel initCenterPanel() {
GridBagLayout gridBagLayout = new GridBagLayout();
JPanel centerPanel = new JPanel(gridBagLayout);
centerPanel.setBackground(Color.WHITE);
//
GridBagConstraints constraint = new GridBagConstraints(0, 0, 1, 1, 0d, 0d, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0);
//
JLabel[] squareLabels = new JLabel[16];
for(int i = 0; i < 16; i++){
constraint.gridx = i % 4;
constraint.gridy = i / 4;
squareLabels[i] = new JLabel("Test");
centerPanel.add(squareLabels[i], constraint);
}
//
JLabel instructionsLabel = new JLabel("This is long instruction!");
constraint.gridy += 1;
constraint.gridx = 0;
constraint.gridwidth = 4;
centerPanel.add(instructionsLabel, constraint);
//
return centerPanel;
}
}

祝你好运。

关于java - 尝试在方格网格下方添加消息 JLabel 时,GridBagLayout 做奇怪的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com