GUI многопоточность.как изменить несколько кнопок с несколькими потоками - PullRequest
0 голосов
/ 11 марта 2012

Мне дано следующее описание проблемы:

Графический интерфейс пользователя имеет ширину 500 пикселей и высоту 550 пикселей. Верхний уровень макета BorderLayout. Добавьте три текстовых поля на севере и три кнопки на юге. Надписи этих кнопок: «Красный», «Зеленый» и «Синий» слева направо. Кнопки изначально включены, тогда как текстовые поля недоступны для редактирования пользователем в течение всего периода выполнения. Кнопки используются для запуска новых тем цвета. Соответствующие текстовые поля показывают количество нитей этого цвета. Центральная область GUI заполнена сеткой кнопок 8 на 8, цвет фона которых изначально установлен на белый. Обратитесь к скриншоту, чтобы понять, как должен выглядеть GUI. Поведение графического интерфейса подробно описано в следующих параграфах. Если пользователь нажимает цветную кнопку на юге, начинается нить этого цвета. В каждом цикле своего выполнения поток случайным образом выбирает квадрат из сетки, которая в настоящее время не занята каким-либо другим потоком. Затем он закрасит этот квадрат в соответствии с представительным цветом нити. Начальный цвет будет весной 2012 г. - CS 302 Object Oriented Design Lab 7 Дата: 27 февраля 2012 г. Страница 3 из 3 будет насыщенным (например, чисто красным для красной нити), но постепенно исчезнет в течение примерно 8 секунд, чтобы превратиться в опять белый. Цикл выполнения потока возобновится путем случайного выбора незанятого квадрата снова. После запуска поток будет работать вечно. Тем не менее, пользователю будет разрешено запускать не более десяти нитей каждого цвета. Тогда соответствующая цветная кнопка будет отключена. Поведение массива текстовых полей простое. Они показывают количество запущенных нитей этого цвета. Как отмечено выше, эти текстовые поля не доступны для редактирования пользователем. Чтобы разработать надежное многопоточное приложение с графическим интерфейсом на Java, программист должен убедиться, что все параметры графического интерфейса (т. Е. Свойства компонентов Swing GUI) фактически обновляются только из одного потока: обычно это поток диспетчера событий. Чтобы получить конкретные идеи по этому поводу, прочитайте «Threads and Swing» по адресу http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html.. В результате создаваемые вами потоки не должны иметь доступа ни к каким компонентам Swing. Скорее поддержите структуру данных, которая подвергается воздействию и обновляется потоками согласно их циклу выполнения. С другой стороны, периодически вызывайте методы repaint () из основного потока, чтобы пригласить поток диспетчера событий Swing, чтобы в конечном итоге посетить содержимое структуры данных и соответственно отобразить компоненты графического интерфейса.

Пока у меня есть графический интерфейс, который делает все, но не меняет цвета. Как заставить отдельные темы менять кнопки одновременно на разные цвета? мне нужны конкретные инструкции о том, что делать, а не обобщенные указания. пожалуйста, не комментируйте, если вы точно не знаете, какой код написать для достижения этой цели. это то, что я имею до сих пор:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...