GUI多线程。如何更改多线程的多按钮

时间:2012-03-11 19:46:51

标签: java multithreading swing user-interface

我收到以下问题描述:

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);
    }
}

}

0 个答案:

没有答案
相关问题