我正在尝试在显示的正方形网格下方显示一条消息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();
}
答案 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
作为主要布局,然后将JPanel
与JLabel
和其他组件添加到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对象 - 你不能像上面那样重复使用相同的实例。