gpt4 book ai didi

java - 所有按钮生成相同的事件,生成相同的输出

转载 作者:行者123 更新时间:2023-12-02 11:41:46 25 4
gpt4 key购买 nike

我编写了一段代码,可以在框架中生成一个简单的矩形,并更改框架上现有圆圈的颜色。

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

class DrawRect extends JPanel{
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;

g2.draw(new Rectangle(200,200,200,200));
}
}

class FillOval extends JPanel{
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;

int red = (int)(Math.random()*255);
int green = (int)(Math.random()*255);
int blue = (int)(Math.random()*255);
Color startColor = new Color(red,green,blue);

red = (int)(Math.random()*255);
green = (int)(Math.random()*255);
blue = (int)(Math.random()*255);

Color endColor = new Color(red,green , blue);
GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
g2.setPaint(gradient);
g2.fillOval(70,70,100,100);
}
}

class MainGui {

public static void main(String[] args){
MainGui gui = new MainGui();
gui.go();
}
JFrame frame;
FillOval ov = new FillOval();
void go(){

frame = new JFrame();
JButton colorButton = new JButton("change color");
JButton rectButton = new JButton("draw rectangle");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

colorButton.addActionListener(new colorListener());
rectButton.addActionListener(new rectListener());

frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.WEST, rectButton);
frame.getContentPane().add(BorderLayout.CENTER, ov);

frame.setSize(500,500);
frame.setVisible(true);
}

class colorListener implements ActionListener{
public void actionPerformed(ActionEvent ev){
frame.repaint();
}
}

class rectListener implements ActionListener{
public void actionPerformed(ActionEvent ev){
DrawRect rect = new DrawRect();
frame.add(rect);
frame.revalidate();
frame.repaint();
}
}
}

现在,问题是 rectButton 按钮正在更改框架中圆圈的颜色,同时在框架中生成矩形。

colorButton按钮事件无关。为什么它会这样?我应该如何解决它?

最佳答案

调用repaint会触发paintComponent的调用,其中颜色始终是随机选择的。您需要将 endColor 定义为 class 的成员,并使用 null 进行初始化。在 paintComponent 方法中检查它是否为 null,如果它是 null,则初始化它。您还需要在 colorListener 处初始化它。在 paintComponent 中,使用 endColor 成员。这样,每当调用 paintComponent 时,您就不会重新定义 endColor。由于您需要在多个位置初始化 endColor,因此最好为其实现一个方法,并在需要初始化颜色时调用该方法以避免代码重复。

关于java - 所有按钮生成相同的事件,生成相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488448/

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