Возникли проблемы с перекрашиванием кругов по нажатию кнопки - PullRequest
1 голос
/ 29 марта 2011

У меня проблемы с перекрашиванием окна при нажатии кнопки. То, что должно произойти, когда я нажимаю кнопку, это то, что на рамке должно быть нарисовано больше кругов (технически это должно быть количество кругов, нарисованных в последний раз * 2) По какой-то причине это не работает, и я не могу понять, почему он не перекрашивается. Вот мой код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Roaches {  
    public static void main(String[] args) {
        //Create the frame
        JFrame frame = new JFrame();
        //Set the frame's size
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Roaches!");
        //Create the button
        JButton button = new JButton("Multiply Roaches!");
        button.addActionListener(new Roach());
        JPanel buttonPanel = new JPanel();
        //Add the button to the panel
        buttonPanel.add(button);
        //Add the panel to the frame
        frame.add(buttonPanel, BorderLayout.SOUTH);
        //Add the roach panel to the frame
        frame.add(new Roach());
        //Make frame visible
        frame.setVisible(true);
    }
}
class Roach extends JComponent implements ActionListener {
    //Keep track of how many roaches to draw
    private int roachCount = 1;
    protected void paintComponent(Graphics g) {
        Graphics2D gr = (Graphics2D)g;
        for(int i = 0; i < roachCount; i++) {
            int x = 5 * i;
            int y = 5 * 1;
            gr.drawOval(x, y, 50, 50);
        }
        System.out.println("REPAINT"); //For testing
    }
    public void actionPerformed(ActionEvent e) {
        roachCount = roachCount * 2;
        repaint();
        System.out.println("CLICK!!!!"); //For testing
    }
}

Я не знаю, имею ли я представление о событиях или перерисовке неправильно, поэтому любая помощь / указатели будут оценены. Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Проблема в том, что вы создаете два экземпляра Роуча. Один, который вы добавляете в качестве слушателя действия в свой JButton, а другой - в рамку для рисования. Поскольку они представляют собой разные экземпляры, нарисованная плотва никогда не получает действия и, следовательно, всегда имеет счет 1.

На самом деле это хороший пример того, почему мне не нравится практика реализации интерфейсов слушателей на объектах графического интерфейса.

3 голосов
/ 29 марта 2011

Вы не хотите создавать new Roach() во второй раз.Просто создайте одну плотву, сохраните ссылку на нее и используйте ссылку везде.

 public static void main(String[] args) {
        //Create the frame
        JFrame frame = new JFrame();
        //Set the frame's size
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Roaches!");
        //Create the button
        JButton button = new JButton("Multiply Roaches!");

        Roach roach = new Roach();

        button.addActionListener(roach);
        JPanel buttonPanel = new JPanel();
        //Add the button to the panel
        buttonPanel.add(button);
        //Add the panel to the frame
        frame.add(buttonPanel, BorderLayout.SOUTH);
        //Add the roach panel to the frame
        frame.add(roach);
        //Make frame visible
        frame.setVisible(true);
    }
...