我收到以下问题描述:
GUI宽500像素,高550像素。顶级布局是BorderLayout。在North添加三个文本字段,在South添加三个按钮。这些按钮的标题是:“红色”,“绿色”和“蓝色”,从左到右。最初启用按钮,而文本字段在整个执行期间不是用户可编辑的。按钮用于启动颜色的新线程。相应的文本字段显示该颜色的线程数。 GUI的中心区域填充有8乘8的按钮网格,所有按钮的背景颜色最初都设置为白色。请参阅屏幕截图,了解GUI的外观。 GUI的行为在以下段落中详细说明。如果用户单击南方的颜色按钮,则会启动该颜色的线程。在其执行的每个循环中,线程将从网格中随机拾取一个当前未被任何其他线程占用的方块。然后它将根据线程的代表颜色为该方块着色。初始颜色将是2012年春季 - CS 302面向对象设计实验室7日期:2012年2月27日第3页,共3页饱和(例如,红色线条为纯红色),但会在约8秒的时间内逐渐褪色变为再次变白。通过随机选择一个未占用的方块,线程的执行周期将恢复。一旦启动,线程将继续运行。但是,允许用户从每种颜色的最多十个线程开始。然后将禁用相应的颜色按钮。文本字段数组的行为很简单。它们显示该颜色的运行线程数。如上所述,这些文本字段不是用户可编辑的。为了用Java开发健壮的多线程GUI应用程序,程序员必须确保所有GUI参数(即GUI Swing组件的属性)实际上只从一个线程更新:通常是Event Dispatcher线程。为了获得有关它的一些具体想法,请阅读http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html处的“Threads and Swing”。因此,您创建的线程不应该有权访问任何Swing组件。而是维护一个由线程根据其执行周期公开和更新的数据结构。另一方面,定期从主线程调用repaint()方法以邀请Swing Event Dispatcher线程最终访问数据结构的内容并相应地显示GUI组件。
到目前为止,我有一个GUI可以完成所有操作,但会改变颜色。如何让各个线程同时更改按钮到不同的颜色?我需要有关做什么的具体说明,而不是一般指示。请不要发表评论,除非您明确知道要编写哪些代码才能完成此任务。这就是我到目前为止所做的:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ColorThread extends JFrame implements ActionListener, Runnable {
Thread nt[] = new Thread[29];
static Runnable rn = new ColorThread();
static public int rcount = 0;
static public int bcount = 0;
static public int gcount = 0;
JTextField r = new JTextField("0");
JTextField g = new JTextField("0");
JTextField b = new JTextField("0");
JButton red = new JButton("Red");
JButton green = new JButton("Green");
JButton blue = new JButton("Blue");
JButton[] mn = new JButton[64];
Boolean[] tkn = new Boolean[64];
int color;
static int count=0;
public ColorThread(){
super("CS 302 Lab7 HW");
for (int j=0; j<tkn.length;j++){
tkn[j]=false;
}
setSize(500,550);
setLayout(new BorderLayout());
JPanel top = new JPanel();
top.setLayout(new GridLayout( 1,0));
JPanel bot = new JPanel();
bot.setLayout(new GridLayout( 1,0));
JPanel mid = new JPanel();
mid.setLayout(new GridLayout( 8,8));
for(int x=0; x<64; x++){
mn[x] = new JButton(""+x);
mn[x].setBackground(Color.WHITE);
mid.add(mn[x]);
mn[x].addActionListener(this);
}
top.add(r);
top.add(g);
top.add(b);
r.setEnabled(false);
g.setEnabled(false);
b.setEnabled(false);
bot.add(red);
bot.add(green);
bot.add(blue);
red.addActionListener(this);
blue.addActionListener(this);
green.addActionListener(this);
add(BorderLayout.NORTH, top );
add(BorderLayout.CENTER, mid);
add(BorderLayout.SOUTH, bot );
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
}
@Override
public void run() {
int r=-1;
while (r==-1){
int rand = ((int) (Math.random()*64));
if (tkn[rand]== false)
{
r=rand;
tkn[r]=true;
}
}
System.out.println(r);
System.out.println(getName());
System.out.println(count);
}
public void setCol(int n){
this.color=n;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Red")){
nt[count] = new Thread(rn);
nt[count].setPriority(10);
nt[count].start();
rcount++;
count++;
r.setText(Integer.toString(Integer.parseInt(r.getText())+1));
if (rcount>=10)
red.setEnabled(false);
}else if(e.getActionCommand().equals("Green")){
nt[count] = new Thread(rn);
nt[count].start();
gcount++;
count++;
g.setText(Integer.toString(Integer.parseInt(g.getText())+1));
if (gcount>=10)
green.setEnabled(false);
}else if(e.getActionCommand().equals("Blue")){
nt[count] = new Thread(rn);
nt[count].start();
bcount++;
count++;
b.setText(Integer.toString(Integer.parseInt(b.getText())+1));
if (bcount>=10)
blue.setEnabled(false);
}
}
}