我正在尝试制作一个程序,允许用户通过鼠标交互来更改JPanels的颜色。我已经建立并运行了一系列JPanels(5x5),但是无论大小如何,它们都可以扩展以适合整个主面板。关于如何为它们提供标准尺寸的任何想法,以使它们不会填满整个窗口并恰好适合中间位置?
有人告诉我可能必须为此使用GridBagLayout而不是GridLayout,但是我实际上对该方法没有任何经验,并且只是第一次听到该名称,因此对此的任何帮助也将是类。
public void gridInit() {
cell = new JPanel [x][x];
setLayout(new GridLayout(5,5));
for (int i = 0; i < x; i ++) {
for (int j = 0; j < x; j ++) {
cell [i][j] = new JPanel();
cell [i][j].setBackground(new Color(i*40, j*30, 10));
cell [i][j].setBorder(loweredetched);
add(cell [i][j]);
}
编辑:我只是意识到这是我的第一篇文章,而不是关于解决错误的信息,这可能是前进的一步:)
最佳答案
将您的单元格放在使用GridLayout创建的用于容纳它们的JPanel中,然后使用适合您的GUI的任何布局将该JPanel添加到主JPanel中。请理解,您可以根据需要嵌套JPanels,每个JPanels使用其自己的布局管理器,从而允许使用简单的布局管理器来创建复杂的布局。
例如。,
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorGrid extends JPanel {
private static final int PREF_W = 750;
private static final int PREF_H = 550;
private static final int GRID_ROWS = 5;
private static final int GRID_COLS = 5;
public ColorGrid() {
JPanel gridPanel = new JPanel(new GridLayout(GRID_ROWS, GRID_COLS));
for (int row = 0; row < GRID_ROWS; row++) {
for (int col = 0; col < GRID_COLS; col++) {
gridPanel.add(new ColorGridCell(row, col));
}
}
setLayout(new GridBagLayout()); // to center component added
add(gridPanel);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
ColorGrid mainPanel = new ColorGrid();
JFrame frame = new JFrame("ColorGrid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class ColorGridCell extends JPanel {
private static final int PREF_W = 100;
private static final int PREF_H = 75;
private final static Color[] COLORS = { Color.red, Color.orange,
Color.yellow, Color.green, Color.blue, Color.cyan, Color.darkGray,
Color.magenta, Color.pink };
private int colorIndex = (int) (Math.random() * COLORS.length);
private int row;
private int col;
public ColorGridCell(int row, int col) {
this.row = row;
this.col = col;
setBackground(COLORS[colorIndex]);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
colorIndex++;
colorIndex %= COLORS.length;
setBackground(COLORS[colorIndex]);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
}