java - 尽管单击了矩形,但我的屏幕不会重新绘制

标签 java swing jpanel mouseevent collision

我的代码设置为,如果在矩形 startButton 内单击鼠标,则 Boolean boxDetect 将设置为 true。剩下的只是格式化,没什么特别的!这是在矩形内部按下之前的初始屏幕,一旦在矩形内按下,它应该在点 400,400 处将屏幕重新绘制为矩形。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.*;

public class spaceInvadersIntroScreen implements MouseListener
{
    private JFrame frame;
    private MyPanel panel;
    private double startButtonX = 0;
    private double startButtonY = 0;
    private Rectangle startButton;
    private Boolean boxDetect = false;

public static void main(String[] args){ new spaceInvadersIntroScreen(); }

public spaceInvadersIntroScreen()
{
    frame = new JFrame("Space Invaders");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    startButtonX = screenSize.getWidth() / 2; //Finds the X value of the center of the screen
    startButtonY = screenSize.getHeight() / 2; //Finds the Y value of the center of the screen
    frame.setSize(screenSize); //width and height
    panel = new MyPanel();
    frame.getContentPane().add(panel);
    frame.setVisible(true);
    startButton = new Rectangle((int)(startButtonX - 200), (int)(startButtonY - 75), 400, 150); //Creates Rectangle in the middle of the screen
}

class MyPanel extends JPanel
{
    private static final long serialVersionUID = 1L;

    public void paint(Graphics g)
    {

    if(boxDetect == false)
    {
        Graphics2D g2d = (Graphics2D) g; 
        //Background 
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,0, 1440, 870);

        //Code for an X centered title regardless of the screen length

        String title = "SPACE INVADERS";
        Font textFont = new Font("monospaced", Font.BOLD, 150);
        FontMetrics textMetrics = g2d.getFontMetrics(textFont);  
        g2d.setFont(textFont);   

        int centeredX = (this.getWidth()/2) - (textMetrics.stringWidth(title)/2);   

        //Prints SPACE INVADERS to the screen
        g2d.setColor(Color.WHITE);
        g2d.setFont(textFont);
        g2d.drawString(title, centeredX, 200);

        //draw the Button
        g2d.setColor(Color.white);
        g2d.fill(startButton); 
    }

    else
    {
        g.setColor(Color.black);
        g.drawRect(400, 400, 400, 400);
    }

    }
}

@Override
public void mouseReleased(MouseEvent e) 
{
    double xCoord = e.getX();
    double yCoord = e.getY();
    if(startButton.contains(xCoord,yCoord) == true)
    {
        boxDetect = true;
    }
    panel.repaint();
}

@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mousePressed(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}
}

最佳答案

您需要添加 MouseListener 才能正常工作。问题:在哪里调用 addMouseListener(...)?答案:你不知道。解决方案:调用此方法将MouseListener添加到需要它的组件中。

关于java - 尽管单击了矩形,但我的屏幕不会重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16248328/

相关文章:

java mail API的传输功能不起作用

java - 如何制作一个等待一秒钟然后继续执行程序的计时器?

java - 未添加到 JList 的元素

java - JLabel 未更新

java - 调用绘制后 JPanel 不显示在 JFrame 中

java - 当尝试删除数据库项时,Spring 表示不支持请求方法 'DELETE'

java - 按下按钮时,应在日期选择器中显示并计数一个数字

java - JFrame调整大小后如何计算圆形的X-Y坐标和半径?

java - 自定义 TableModel Swing 中的 removeRow() 方法

java - 如何在 JPanel 中显示文件中的文本?