Перекрашивать кадр по клику мышью?

1

В настоящее время я пытаюсь создать игру с графическим интерфейсом, который должен нарисовать новые вещи на экране при нажатии кнопки. Например:

public class GUI() extends JPanel {
    public void paintComponent() {
      /*
       *Basic initial set up here
       */

      // ***** Call method here on mouse click ***** 
    }
    public void setUpGUI() {
        JFrame mainFrame = new JFrame();
        GUI paintGUI = new GUI();
        clickDetector click = new clickDetector();

        mainFrame.addMouseListener(click);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(500, 500);
        mainFrame.getContentPane().add(paintGUI);
        mainFrame.setVisible(true);
    }

    public static void main(String args[]) {
        GUI gui = new GUI();
        gui.setUpGUI();
    }
}

Мне нужно реализовать метод в методе //***** Call method here on mouse click ***** который будет рисовать новые дополнения к кадру (в моем случае это круги, которые представляют части на доске) но я не уверен, как это сделать при нажатии кнопки. Как я могу перекрасить кадр при каждом щелчке мыши, чтобы я мог изменить свою игровую панель?

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

Вот мой код paintComponent, а также прослушиватель, используемый для перерисовки.

public void paintComponent(Graphics g) {
        super.paintComponent(g);

        System.out.println("Method called");
        g.setColor(Color.red);

        for(int y = 0; y < 6; y++) {
            for(int x = 0; x < 7; x++) {
                g.fillOval(x*70 + 10, y*70 + 10, 50, 50);
            }
        }

        g.setColor(Color.BLACK);
        g.fillRect(0, 430, 500, 50);
        g.setColor(Color.white);
        g.drawString("CONNECT FOUR", 250, 450);
        g.setColor(Color.LIGHT_GRAY);
        click.paintPiece(g);

    }

public void mouseClicked(MouseEvent e) {
        this.repaint();     

    }

Вот метод, который paintComponent должен вызывать, но не

public void paintPiece(Graphics g) {
        int x = getMouseX() + 10;
        int y = mover.getRow() + 10;
        g.fillOval(x, y, 50, 50);
    }
  • 1
    Вы пытались вызвать repaint() при получении щелчка мыши?
Теги:
swing

3 ответа

2
Лучший ответ

Просто создайте прослушиватель мыши:

MouseListener listen = new MouseListener()
{
    void mouseClicked(MouseEvent e){}
    void mouseReleased(MouseEvent e){}
    void mousePressed(MouseEvent e){paintGUI.repaint();}
    void mouseExited(MouseEvent e){}
    void mouseEntered(MouseEvent e){}
};
paintGUI.addMouseListener(listen);

Каждый раз, когда вы нажимаете внутри JPanel, вы должны увидеть его перерисовку. Аналогично, если вы хотите обновить, когда нажата JButton, просто используйте ActionListener:

ActionListener listen = new ActionListener()
{
    public void actionPerformed(ActionEvent e){paintGUI.repaint();}
}
button.addActionListener(listen);

Это должно быть помещено в ваш setUpGUI().

  • 1
    Спасибо за эту идею, я не думал использовать слушателя мыши в моем классе, где происходит рисование. Я считаю, что это будет работать, хотя я столкнулся с одной проблемой. Моя доска определенно перекрашивается сейчас, но метод добавления фигур не вызывается. Я добавил код в свой ответ, чтобы показать, что я имею в виду.
0

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

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GUI extends JPanel implements MouseListener{
    private Rectangle rect;
    private int width = 100;
    private int height = 100;

    public GUI(int x, int y, int width, int height)
    {
        rect = new Rectangle(x, y, width, height);
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.draw(rect);
    }

    public void mouseClicked(MouseEvent e) {
        rect = new Rectangle(e.getX(), e.getY(), width, height);
        repaint();
    }


    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void setUpGUI() {
        JFrame mainFrame = new JFrame();

        mainFrame.addMouseListener(this);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(500, 500);
        mainFrame.getContentPane().add(this);
        mainFrame.setVisible(true);
    }

    public static void main(String args[]) {
        GUI gui = new GUI(0,0,100,100);
        gui.setUpGUI();
    }


}

Обратите внимание на MouseListener был реализован GUI класса и, когда вы пытаетесь инициализировать MouseListener для кадра, вы просто положить this в качестве параметра, который будет относиться к GUI класса и, следовательно, к вашим JPanel

0

Добавьте к кнопке прослушиватель событий события.

Слушатель событий событий Oracle Docs

В методе actionPerformed добавьте все, что нужно добавить, затем вызовите

перекрасить();

  • 1
    ОП упомянул нажатие на кнопку . Лучшим слушателем для кнопки является ActionListener так как он будет реагировать как на мышь, так и на клавиатуру .
  • 0
    @ AndrewThompson Да, я пропустил это, я думал, что он сказал только на нажатие кнопки. Хороший улов, я буду редактировать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню