Java 线程和图形

Java 线程和图形,java,multithreading,graphics,Java,Multithreading,Graphics,我正在制作一个带有棋盘(如棋盘,大小为m x n)的小程序,每个字段必须位于不同的线程中,并且必须每秒更改颜色,直到我将其关闭。我该怎么处理这个?我不能把g.setColor或g.fillRect放在run方法中。是否有任何方法可以使用paintComponent方法,在每个字段的单独线程中,每秒绘制整个内容并更改颜色 小程序: import javax.swing.JApplet; public class MyApplet extends JApplet { public voi

我正在制作一个带有棋盘(如棋盘,大小为m x n)的小程序,每个字段必须位于不同的线程中,并且必须每秒更改颜色,直到我将其关闭。我该怎么处理这个?我不能把
g.setColor
g.fillRect
放在run方法中。是否有任何方法可以使用
paintComponent
方法,在每个字段的单独线程中,每秒绘制整个内容并更改颜色

小程序:

import javax.swing.JApplet;

public class MyApplet extends JApplet {

    public void init() {
        add(new Board(  Integer.parseInt(getParameter("m")),
                            Integer.parseInt(getParameter("n")),
                            Integer.parseInt(getParameter("k")),
                            Integer.parseInt(getParameter("p"))
        ));
    }
}
董事会:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.net.*;
import java.util.Random;

class NowyWatek extends Board implements Runnable{
    public NowyWatek(){
        super(0, 0, 0, 0);
    }
    public void run(){
        Random random=new Random();
        int r1=random.nextInt(255)+0;
        int r2=random.nextInt(255)+0;
        int r3=random.nextInt(255)+0;
        g.setColor(r1, r2, r3);
    }

}

public class Board extends JPanel {
    int m,n,k,p;
    public Board (int m, int n, int k, int p) {
            super();
            this.m = m;
            this.n = n;
            this.k = k;
            this.p = p;
    }

    public void paintComponent(Graphics g)
    {
            int a=0, b=0;
            for(int i=0; i<m*n;i++)
            {
                NowyWatek nowywatek=new NowyWatek();
                Thread thread=new Thread(nowywatek);
                thread.start();
                g.fillRect(a,b,29,29);
                a+=30;
                if(i%n==n-1)
                {
                    a=0;
                    b+=30;
                }
            }
        }
    }
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.applet.*;
导入java.net。*;
导入java.util.Random;
类NowyWatek扩展板实现Runnable{
公共NowyWatek(){
超级(0,0,0,0);
}
公开募捐{
随机=新随机();
int r1=random.nextInt(255)+0;
int r2=random.nextInt(255)+0;
int r3=random.nextInt(255)+0;
g、 setColor(r1、r2、r3);
}
}
公共课程委员会扩展JPanel{
int m,n,k,p;
公共董事会(整数m、整数n、整数k、整数p){
超级();
这个,m=m;
这个,n=n;
这个。k=k;
这个,p=p;
}
公共组件(图形g)
{
int a=0,b=0;
对于(int i=0;i
它必须每秒钟改变一次颜色,直到我把它关掉。我该怎么做呢

  • 创建更新颜色并调用组件上的
    repaint
  • 保留对在(1)中更改的颜色对象的引用
  • 将颜色对象从(2)传递到
    g.setColor
    中的
    paintComponent
  • 例如:

    Color color = Color.WHITE;
    Random random = new Random();
    ....
    Timer timer = new Timer(1000, new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            int r1=random.nextInt(255);
            int r2=random.nextInt(255);
            int r3=random.nextInt(255);
            color = new Color(r1, r2, r3);
            repaint();
        }
    });
    timer.start();
    ...
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(color);
        ...
    }
    

    我不建议每次调用paintComponent时都创建一个新线程。如果希望定期(和定时)更改组件的绘制方式,请使用,更改需要更改的数据并调用
    repaint