gpt4 book ai didi

Java Swing - 单击形状来更改其颜色

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:03 25 4
gpt4 key购买 nike

我需要制作一个 Java Swing 应用程序,在屏幕上显示一个矩形,如果单击它,它应该将其颜色更改为黑色(如果它是白色)或白色(如果它是黑色)。问题在于它是一个需要扩展 JComponent 并重写 PaintComponent 的类。除了点击部分之外,我已经完成了所有事情。由于某种原因,我无法使其仅在单击时改变颜色。当单击除背景之外的背景时,它也会改变颜色。

这是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class RectangleC extends JComponent implements MouseListener{
private int width, height;
private Color color;

public RectangleC(int w, int h, Color c){
width = w;
height = h;
color = c;
this.addMouseListener(this);
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(color);
g.fillRect(0, 0, width, height);
}

@Override
public void mousePressed(MouseEvent e){
if(this.contains(e.getPoint())){
if(color == Color.WHITE) {
color = Color.BLACK;
}
else {
color = Color.WHITE;
}
}
repaint();
}

public void mouseClicked(MouseEvent e){};
public void mouseReleased(MouseEvent e){};
public void mouseEntered(MouseEvent e){};
public void mouseExited(MouseEvent e){};

public static void main(String args[]){
JFrame frame = new JFrame("Rectangle Component");
RectangleC rectangle2 = new RectangleC(300, 500, Color.BLACK);
frame.add(rectangle2);
frame.setSize(600,600);;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

我似乎无法使用 e.getPoint() 方法让它工作。我还尝试使用坐标以及 e.getX() 和 e.getY() ,只要形状处于默认位置,它就可以工作。但是,如果形状被移动到中心,它就不再起作用。

这是我尝试过的方法:

    @Override
public void mousePressed(MouseEvent e)
{
int currentX = e.getX();
int currentY = e.getY();
if(currentX > this.getX() && currentX < this.getX() + width && currentY > this.getY() && currentY < this.getY() + height ){
if(color != Color.WHITE)
color = Color.WHITE;
else
color = Color.black;
}
repaint();
}

如何才能使其仅在单击时改变颜色?我真的没有主意了,我找不到任何方法来做到这一点。

最佳答案

好的,看来上面共享的代码没有问题,但有一个小问题,即在 mousePressed 中进行比较时,您采用的是 component 的 x 和 y,而不是在 Component 上绘制的 矩形。因此,您可以做的是创建两个函数来返回矩形的 x 和 y,然后在需要检查矩形坐标的地方使用这些函数。

请在下面找到更新的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class RectangleC extends JComponent implements MouseListener{
private int width, height;
int x,y;
private Color color;

public RectangleC(int w, int h, Color c){
width = w;
height = h;

//Given x and y some default position. This can be changed as required
x = 20;
y = 20;

color = c;
this.addMouseListener(this);
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(color);
g.fillRect(x, y, width, height);
}

@Override
public void mousePressed(MouseEvent e)
{
int currentX = e.getX();
int currentY = e.getY();
if(currentX > this.getRectX() && currentX < this.getRectX() + width && currentY > this.getRectY() && currentY < this.getRectY() + height ){
if(color != Color.WHITE)
color = Color.WHITE;
else
color = Color.black;
}
repaint();
}

// Function to return rectangle coordinate
private int getRectX() {
return this.getX()+x;
}


private int getRectY() {
return this.getY()+y;
}
public void mouseClicked(MouseEvent e){};
public void mouseReleased(MouseEvent e){};
public void mouseEntered(MouseEvent e){};
public void mouseExited(MouseEvent e){};

public static void main(String args[]){
JFrame frame = new JFrame("Rectangle Component");
RectangleC rectangle2 = new RectangleC(300, 500, Color.BLACK);
frame.add(rectangle2);
frame.setSize(600,600);;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

关于Java Swing - 单击形状来更改其颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49888948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com