gpt4 book ai didi

java - 第二次单击鼠标时 JPanel 不更新

转载 作者:行者123 更新时间:2023-12-01 18:41:05 24 4
gpt4 key购买 nike

完成并运行一个简单的程序后,您可以在单击形状时更改形状的颜色:

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

class MyPanel extends JPanel{
int x = 200,y = 200,r = 50;
static Color co = Color.BLUE;
static final JFrame frame = new JFrame();
public static void main(String[] args){
frame.setTitle("Color Change with Mouse Click");
frame.setSize(500,500);
MyPanel pane = new MyPanel();
frame.add(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pane.setVisible(true);
}

public void Panel(){
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(((e.getX() >= (x-r) && e.getX() < (x+r) && e.getY() >= (y-r) && e.getY() < (y+r))) & (co == Color.GREEN)){
co = Color.BLUE;
repaint();
};
if(((e.getX() >= (x-r) && e.getX() < (x+r) && e.getY() >= (y-r) && e.getY() < (y+r))) & (co == Color.BLUE)){
co = Color.GREEN;
repaint();
};
}
});
}

Timer timer = new Timer(1, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
Panel();
}
});

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
timer.start();
Panel();
g.setColor(co);
g.fillOval(x-r, y-r, 2*r, 2*r);
repaint();
}
}

我遇到了一个我根本不知道如何解决的问题。 JPanel 永远不会在第二次鼠标单击时更新,仅在第一次单击时更新。我认为添加计时器可以解决这个问题,但显然事实并非如此。非常感谢您的帮助。

编辑:我根据 Aqua 的建议更改了代码:

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

class MyPanel extends JPanel{
int x = 200,y = 200,r = 50;
static Color co = Color.BLUE;

public static void main(String[] args){
final JFrame frame = new JFrame();
frame.setTitle("Color Change with Mouse Click");
MyPanel pane = new MyPanel();
frame.add(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}

public void panel(){
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(((e.getX() >= (x-r) && e.getX() < (x+r) && e.getY() >= (y-r) && e.getY() < (y+r))) && (co == Color.GREEN)){
co = Color.BLUE;
repaint();
}else if(((e.getX() >= (x-r) && e.getX() < (x+r) && e.getY() >= (y-r) && e.getY() < (y+r))) && (co == Color.BLUE)){
co = Color.GREEN;
repaint();
}else{
repaint();
};
}
});
}
public MyPanel(){
Timer timer = new Timer(20, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
panel();
}
});
timer.start();
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(co);
g.fillOval(x-r, y-r, 2*r, 2*r);
repaint();
}
}

颜色变化现在可以工作,但是颜色变化有点不可预测。有时它有延迟,有时没有,有时它根本不会变回来。这是我的计时器有问题吗?

最佳答案

定时器的意义是什么?计时器用于安排事件。您没有安排任何事件,您正在等待用户单击鼠标。不需要计时器。如果您确实需要计时器,那么:

  1. 您永远不会安排计时器每毫秒触发一次,这对于机器响应来说太快了。根据要求使用更实际的值。也许 50 或 100 毫秒。

  2. 你永远不会在绘画方法中启动计时器。您可能会在类的构造函数中启动计时器。

您的 MouseListener 代码错误。您启动 Timer 并调用 Panel() 方法,该方法又调用 addMouseListener() 方法。因此 1 秒后,您将在面板中添加 1000 个 MouseListener。这显然是错误的。 MouseListener 应添加到类的构造函数中。

不需要“co”变量(如果需要,它就不是静态的)。所有 Swing 组件都支持 setForeground() 方法来设置绘制文本的颜色。在您的情况下,您正在绘制一个形状,但当您想要更改颜色时,您仍然可以使用 setForeground() 方法。然后在您的绘画代码中您只需使用:

//g.setColor(co);
g.setColor(getForeground());

由于您将 MouseListener 添加到面板中,因此无需检查鼠标单击的点。仅当您单击面板时才会生成该事件。所以你需要做的就是使用 setForeground(...) 设置你想要的颜色。您甚至不需要调用重绘,因为 Swing 足够智能,可以在您更改其属性之一时重绘自身。

关于java - 第二次单击鼠标时 JPanel 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19957998/

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