Вопросы Java Swing относительно методов GridLayout и PaintComponent

StackOverflow https://stackoverflow.com/questions/1817789

Вопрос

В этой программе нам нужно создать сетку виджетов «LifeCell» размером 8x8.Преподаватель не упомянул, что виджеты должны быть объектом Shape поэтому я пошел дальше и использовал GridLayout сорт.А GridLayout класс работает нормально (насколько я знаю, поскольку нет визуального средства для подтверждения). Цель программы — сыграть в «Игру жизни», где пользователь может щелкнуть один из виджетов LifeCell и переключаться между состояниями «живой». или «мертв».

Мой вопрос во многом зависит от окраски ячеек.Это может быть проблема с моим кодом, но я не уверен на 100%.

Программа2.java

public class Program2 extends JPanel implements ActionListener {
private LifeCell[][] board; // Board of life cells.
private JButton next; // Press for next generation.
private JFrame frame; // The program frame.

public Program2() {
    // The usual boilerplate constructor that pastes the main
    // panel into a frame and displays the frame. It should
    // invoke the "init" method before packing the frame
    frame = new JFrame("LIFECELL!");
    frame.setContentPane(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.init();
    frame.pack();
    frame.setVisible(true);
}
    public void init() {
    // Create the user interface on the main panel. Construct
    // the LifeCell widgets, add them to the panel, and store
    // them in the two-dimensional array "board". Create the
    // "next" button that will show the next generation.
    LifeCell[][] board = new LifeCell[8][8];
    this.setPreferredSize(new Dimension(600, 600));
    this.setBackground(Color.white);
    this.setLayout(new GridLayout(8, 8));
    // here is where I initialize the LifeCell widgets
    for (int u = 0; u < 8; u++) {
        for (int r = 0; r < 8; r++) {
            board[u][r] = new LifeCell(board, u, r);
            this.add(board[u][r]);
            this.setVisible(true);

        }
    }

LifeCell.java

 public class LifeCell extends JPanel implements MouseListener {
   private LifeCell[][] board; // A reference to the board array.
   private boolean alive;      // Stores the state of the cell.
   private int row, col;       // Position of the cell on the board.
   private int count;          // Stores number of living neighbors.

   public LifeCell(LifeCell[][] b, int r, int c) {
       // Initialize the life cell as dead.  Store the reference
       // to the board array and the board position passed as
       // arguments.  Initialize the neighbor count to zero.
       // Register the cell as listener to its own mouse events.
       this.board = b;
       this.row = r;
       this.col = c;
       this.alive = false;
       this.count = 0;
       addMouseListener(this);
   }   

и вот paintComponent метод:

   public void paintComponent(Graphics gr) {
       // Paint the cell.  The cell must be painted differently
       // when alive than when dead, so the user can clearly see
       // the state of the cell.
           Graphics2D g = (Graphics2D) gr;
           super.paintComponent(gr);
           g.setPaint(Color.BLUE);
   }

Мне не нужно точное решение, чтобы это исправить, но я в тупике, пытаясь заставить его работать.

Спасибо.

РЕДАКТИРОВАТЬ:

Я добавил еще сегмент класса Program2.java, могу проверить завтра. Я отправляюсь спать, я ценю всю помощь, ребята.

РЕДАКТИРОВАТЬ № 2:

Мое настоящее замешательство начинается, когда я заполняю свой кадр размером 8x8. GridLayout каждая отдельная «ячейка» за неимением лучшего слова относится к типу LifeCell.Как я могу раскрасить каждую LifeCell различные цвета?Если это имеет для вас хоть какой-то смысл, ребята, я могу попытаться пересмотреть это как можно больше.И camickr, я посмотрю этот сайт, спасибо.

Задание можно найти здесь чтобы избежать путаницы относительно моего вопроса и/или фрагмента кода.

Это было полезно?

Решение

alt text

Вы на правильном пути.

Если вы хотите использовать существующий компонент (например, JPanel, JLabel, JButton и т. д.), гораздо лучше, если вы будете соблюдать то, что компонент уже делает, и просто параметризовать то, что необходимо.

Итак, в вашем случае вы используете JPanel, этот (и другие JComponents) имеют background свойство, которое вы можете изменить.Итак, вместо того, чтобы пытаться покрасить компонент самостоятельно (что сейчас не получается), просто установите это значение и позвольте краске закрасить себя.

Вы можете добавить getLifeColor, который возвращает разные цвета в зависимости от состояния ячейки:

   private Color getLifeColor() {
       return this.alive?liveColor:deadColor;
   } 

А затем просто попросите ячейку закрасить фон этим цветом:

  public void paintComponent(Graphics gr) {
       setBackground( getLifeColor() );
       super.paintComponent( gr );
  }

После этого вам просто нужно установить состояние ячейки: живое или мертвое, и компонент появится соответствующего цвета:

alt text

Вот короткий автономный правильный пример (SSCCE) опубликованного вами кода + использование живого/мертвого цвета.Я думаю, вы можете продолжить оттуда.

Другие советы

JPanel не имеет предпочтительного размера по умолчанию или видимого содержимого.вам нужно будет добавить какой-нибудь видимый компонент (например, JLabel) или задать ему предпочтительный размер.

кроме этого, ваш макет должен работать, если вы настроили его следующим образом:

JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(8, 8));
for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
        cp.add(new JLabel(i + "-" + j));
frame.pack();
frame.setVisible(true);

Зачем вам вообще нужен метод PaintComponent() для вашего LifeCell?Нет необходимости делать индивидуальную покраску.Вы можете изменить цвет фона любого компонента, используя:

setBackground( Color.BLUE ) 

В остальном ваш вопрос для меня не имеет смысла.Сначала вы заявляете, что вам нужно использовать объект Shape, но я не вижу объекта Shape нигде в вашем коде, так почему же вы запутали вопрос, упомянув об этом?

Я действительно не понимаю ваш вопрос, и у нас недостаточно вашего кода, чтобы дать какие-либо реальные предложения.

Если вам нужна дополнительная помощь, опубликуйте SSCCE показывая проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top