Swing Timer - alternatywa

0

Witam,

Mam następujący problem do rozwiązania. Istnieje sobie tablica Button'ów, w której co określony czas (rzędu sekund) kolor tła zmieniają wybrane Button'y ze względu na 'jakiś' algorytm. W zasadzie to problem polega na wyliczeniu co określony czas nowych współrzędnych, pod którym Button ma zmienić kolor.

Próbowałem wykorzystać do tego Timer ze Swing'a, ale przez cały dzień nic mi się nie udało osiągnąć :/ Kod mogę wkleić w razie czego..

Macie na to jakieś pomysły? Może alternatywa do Timer'a - coś prostszego? :)
Mam nadzieję, że w miarę przystępnie opisałem problem :)

Dzięki z góry.

1

Napisałem programik, który zmienia kolor wylosowanego elementu JButton

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Kameleon extends JFrame
{
    private javax.swing.Timer timer=null;
    private Random losowacz=new Random();
    private JButton[][] przyciski=new JButton[4][4];
    //------------------------
    public static void main(String[] args)
    {
        new Kameleon();
    }
    //------------------------
    public Kameleon()
    {
        super("Kameleon");
        setLayout(new GridLayout(4,4));
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
            {
                JButton b=new JButton(""+(i+1)+","+(j+1));
                {
                    przyciski[i][j]=b;
                    add(b);
                }
            }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);

        timer=new javax.swing.Timer(1000,new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
            	Color color=new Color(losowacz.nextInt(256),losowacz.nextInt(256),losowacz.nextInt(256));
            	przyciski[losowacz.nextInt(4)][losowacz.nextInt(4)].setBackground(color);
            }
        });
        timer.start();
    }
}

działa, po zamianie JButton na Button również działa
pozdrawiam

0

Dzięki wielkie bogdans!

Bardzo mi to pomogło, okazało się, że nie za bardzo rozumiem zależności między klasami :/. Nie mogłem wyczaić jak korzystać z różnych elementów i metod w ActionListener'ze. Pzdr.

0

JButton b=new JButton(""+(i+1)+","+(j+1));

nie bardzo rozumiem, skąd taki konstruktor, w dokumentacji JButton nie widzę konstruktora z parametrami typu int. Proszę o wyjaśnienie, czym są tutaj te liczby.

1

Liczby są liczbami, a wyrażenie

""+(i+1)+","+(j+1)
jest Stringiem. W Javie wyrażania postaci w1+w2+....+wk są (jeśli co najmniej jeden składnik jest typu String) automatycznie konwertowane do w1.toString()+...+wk.toString().

0

bo, dziękuję, nie wiedziałam o tym. Rozumiem, że na przycisku b jest widoczne są spacja i przecinek, a liczby w konstruktorze pojawiają się po to, żeby utworzyć kilka obiektów o nazwie b. Jeśli się mylę, proszę o sprostowanie.

1

Przecież możesz skompilować i uruchomić.
Na przyciskach są napisy typu 2,3.

            for(int j=0;j<4;j++)
            {
                JButton b=new JButton(""+(i+1)+","+(j+1));
                //nazwa b została tu (po nawiasie klamrowym) zadeklarowana, zatem za zamykającym nawiasem klamrowym jest nieznana
                {
                    przyciski[i][j]=b;
                    add(b);
                }
            }

W programie nie ma żadnego przycisku o nazwie b.

0

Mam jeszcze jedno pytanie. Zmieniam sobie różne opcje w tym kodzie i chciałam, żeby początkowy kolor buttonów był np. red:

public Kameleon()
{
super("Kameleon");
setLayout(new GridLayout(4,4));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
JButton b=new JButton(" ");
b.setBackground(RED);
{
przyciski[i][j]=b;
add(b);
}
}

ale pojawia się komunikat: RED cannot be resolved to a variable. Dlaczego?

1

Bo RED to jest stała w klasie Color, zamień RED na Color.RED, ewentualnie dodaj brakującą deklaracje importu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1