Как сделать кучу интерактивных панелей в Java JFrame - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь воссоздать Game of Life на Java с помощью JFrame.Я уже завершил большую часть программы, но это меня беспокоит.Как создать связку полей (панелей), которые можно нажимать, чтобы пользователь мог вводить свой собственный шаблон вместо компьютера, генерирующего случайный случай каждый раз?

1 Ответ

1 голос
/ 25 апреля 2019

Вы можете использовать менеджер макета GridLayout, чтобы поместить все JPanels в сетку, и для каждого JPanel добавьте экземпляр класса MouseAdapter с помощью addMouseListener () для прослушивания щелчков мыши, чтобы изменить их состояние. Экземпляр 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;
    }
}

}

В качестве альтернативы, вы можете переопределить метод paintComponent () одного JPanel и выполнить вышеописанное, но также использовать addMouseMotionListener (), чтобы ваша единственная панель могла отслеживать, в какой ячейке нарисованной сетки находится мышь, и вы можете контролировать, как они нарисованы.

...