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

时间:2015-09-23 02:52:36

标签: java jpanel graphics2d

1.这是一个更大的游戏的一部分。我想调用方法来创建和显示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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

    了解更多详情

答案 1 :(得分:1)

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