如何在Java JFrame中创建一堆可单击的面板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java JFrame中创建一堆可单击的面板相关的知识,希望对你有一定的参考价值。

我正在尝试使用JFrame重新创建Java中的生命游戏。我已经完成了大部分计划,但这一件事让我烦恼。如何创建一组可点击的字段(面板),以便用户可以输入自己的模式,而不是每次随机生成模式的计算机?

答案

您可以使用GridLayout布局管理器将所有JPanel放入网格中,对于每个JPanel,使用addMouseListener()添加MouseAdapter类的实例以侦听鼠标单击以翻转其状态。 MouseAdapter的实例将覆盖mouseClicked(),并在该函数内,翻转JPanel的状态。

这只是为了做一个完整的例子,但这里将创建框架并设置其布局管理器:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    int width = 200, height = 200;
    frame.setSize(width, height);
    int rows = width/10, cols = height/10;
    frame.setLayout(new GridLayout(rows, cols));
    // add all the cells
    for(int j = 0; j < cols; j++) {
        for(int i = 0; i < rows; i++) {
            frame.add(new Cell(i, j));
        }
    }
    frame.setVisible(true);
}

然后对于每个单元格,我们有这个类的实例:

class Cell extends JPanel {
int row, col;
public static final int STATE_DEAD = 0;
public static final int STATE_ALIVE = 1;
int state = STATE_DEAD;

public Cell(int row, int col) {
    this.row = row;
    this.col = col;
    // MouseAdapter tells a component how it should react to mouse events
    MouseAdapter mouseAdapter = new MouseAdapter() {
        // using mouseReleased because moving the mouse slightly
        // while clicking will register as a drag instead of a click
        @Override
        public void mouseReleased(MouseEvent e) {
            flip();
            repaint(); // redraw the JPanel to reflect new state
        }
    };
    // assign that behavior to this JPanel for mouse button events
    addMouseListener(mouseAdapter);
}

// Override this method to change drawing behavior to reflect state
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // fill the cell with black if it is dead
    if(state == STATE_DEAD) {
        g.setColor(Color.black);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

public void flip() {
    if(state == STATE_DEAD) {
        state = STATE_ALIVE;
    } else {
        state = STATE_DEAD;
    }
}

}

或者,您可以覆盖一个JPanel的paintComponent()方法,并执行上述操作,但也使用addMouseMotionListener(),这样您的一个面板可以跟踪鼠标所在的绘制网格单元格,并且您可以控制它们的绘制方式。

以上是关于如何在Java JFrame中创建一堆可单击的面板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jFrame 上布局多个面板? (爪哇)

如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

java swing问题:JFrame根面板不透明且可见,内容面板不透明且可见,层面板透明且可见,

在java中面板和框架啥区别?

如何使用 Swing 在 JFrame 中添加面板

Java中如何设置在JFrame中控件的位置和大小