【问题标题】:Repainting a frame on mouse click?单击鼠标重绘框架?
【发布时间】:2015-04-12 03:58:08
【问题描述】:

我目前正在尝试使用 GUI 制作一款游戏,该游戏需要在单击按钮时在屏幕上绘制新事物。例如:

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);
    }

【问题讨论】:

  • 你有没有试过在收到鼠标点击时调用repaint()

标签: java swing


【解决方案1】:

只需创建一个鼠标监听器:

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() 方法中。

【讨论】:

  • 感谢这个想法,我没想到在我的绘画发生的课堂上使用鼠标监听器。我相信这会奏效,尽管我遇到了一个问题。我的板子现在肯定在重新粉刷,但是没有调用添加碎片的方法。我已将代码添加到我的答案中以说明我的意思。
【解决方案2】:

为按钮添加一个动作事件监听器。

Oracle Docs Action Event Listener

在 actionPerformed 方法中添加需要添加的内容然后调用

重绘();

【讨论】:

  • OP 确实提到了单击按钮。按钮的最佳监听器是ActionListener,因为它会对鼠标和键盘输入做出反应。
  • @AndrewThompson 是的,我错过了,我以为他只是在单击按钮时说的。很好,我会编辑。
【解决方案3】:

此更改将允许您在每次单击框架时绘制一个矩形

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

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多