尝试在正方形网格

时间:2016-05-04 12:12:15

标签: java jpanel jlabel gridbaglayout

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

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();
}

2 个答案:

答案 0 :(得分:1)

您要将instructionsLabel添加到第五行的第一列,位于JLabel s的4 * 4矩阵之后。

问题是因为您的instructionsLabel的长度比squareLabels[i]长,因此GridBagLayout的默认行为会使第一列延伸到instructionsLabel。< / p>

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

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

通过设置constraint.gridwidth = 4;,您告诉布局管理员将instructionsLabel放在多个列中。 (这里我设置了4列。)

LineBorder添加一些JLabel有助于您更好地了解GridBagLayout及其Constraints的行为。

<强> [UPDATE] 您可以使用BorderLayout作为主要布局,然后将JPanelJLabel和其他组件添加到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;
    }
}

祝你好运。

答案 1 :(得分:0)

我认为你需要使用一个单独的GridBagConstraints对象 - 你不能像上面那样重复使用相同的实例。