Java- 调用方法改变椭圆的颜色

Java- Calling a method to change the color of an Oval

1.This 是更大游戏的一部分。我想调用方法来创建和显示 Jpanel,然后能够使用整数调用 displayColors 方法(基于其他 类 中的事件)来更改呈现的圆圈的颜色。我遇到了一个似乎有用的 repaint() 方法,但我不确定如何使用它。

import java.awt.*;
import javax.swing.*;
public class SimonView extends JPanel {

    public Graphics2D showSimonsColor;

    public void displayScreen() {

        //Setting up the container
        JFrame frame = new JFrame("Circle Color Game");
        JLabel mitaLabel = new JLabel("A Changing Circle");

        setLayout(new BorderLayout());
        frame.add(mitaLabel, BorderLayout.PAGE_START);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SimonView());
        frame.setSize(700, 700);
        frame.setVisible(true);

        //just to test the display colors method. Pauses for 5 secs
        SimonView sv = new SimonView();

        for (int i = 0 ; i < 5 ; i ++) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
            sv.displayColors(i);
        }

    }

    @Override
    public void paint(Graphics g)  {
        showSimonsColor = (Graphics2D) g;
        showSimonsColor.setColor(Color.BLACK);
        showSimonsColor.fillOval(75, 75, 500, 500);
    }

    public void displayColors(int color)  {

        switch (color)  {

            case 0: showSimonsColor.setColor(Color.WHITE);
                break;
            case 1: showSimonsColor.setColor(Color.RED);
                break;
            case 2: showSimonsColor.setColor(Color.BLUE);
                break;
            case 3: showSimonsColor.setColor(Color.GREEN);
                break;
            case 4: showSimonsColor.setColor(Color.YELLOW);
                break;
        }
    }

    public static void main(String[] arguments) {

        SimonView sv = new SimonView();
        sv.displayScreen();
    }
}
  1. 您创建了三个不同的 SimonView 实例,none 它们之间有任何关系,只有一个实际显示在屏幕上
  2. 您应该调用 repaint 请求重新绘制您的组件(在您进行了一些需要重新绘制的更改之后)
  3. 您不应维护对 Graphics2D 对象的引用,而应在调用时从 paint 中绘制组件的当前状态。这意味着您将需要维护对您要使用的当前颜色的引用
  4. 您应该尽可能避免覆盖 paint,这有很多有趣的原因,但使用 paintComponent 更简单
  5. 您应该调用 super.paint(或者 super.paintComponent,如果您覆盖了它)以保留油漆链
  6. 您应该使用 Swing Timer 在 Swing 中执行延时操作,更新 UI 更安全并且不会阻塞事件调度线程,阻止它执行更新
  7. 您应该从事件调度线程的上下文中启动您的 UI,这只会减少某些系统上线程死锁的潜在问题

看看

了解更多详情

我能想到的最简单的方法是创建一种方法,将一种颜色作为输入并创建一个具有该颜色的椭圆,返回彩色椭圆。当您将这个椭圆形添加到面板时,它会擦除​​并重新绘制旧的椭圆形,从而改变颜色。