Wybór zmiennej zależny od wartości innej zmiennej

0

Witam
Jestem tu nowy, a Javy też uczę się od niedawna. Mam jednak pytanie, dość specyficzne. Robię aplikację z kilkoma buttonami, przy czym każdy button będzie robić dokładnie to samo, ale dla innej zmiennej i zmieniał także etykietę buttona.
Nie chcę robić tego za pomocą Action Listenera dla każdego przycisku, dlatego piszę tutaj, aby zweryfikować, czy jest taka możliwość.

mam powiedzmy przycisk i listenera zrobionego z parametrem:

a1.addActionListener(new Zmien("a1"));

oraz oczywiście klasę:

class Zmien implements ActionListener{
	String zmienna;
			
	Zmien(String xx){
		zmienna=xx;
	}
	public void actionPerformed(ActionEvent e){
                a1.setLabel(Integer.toString(z.zmien()));	
	}
}

Jedną z rzeczy którą chcę właśnie osiągnąć, to zmiana etykiety klikanego przycisku - teraz jest na sztywno a1, ale np mam tych przycisków dużo więcej, i chciałbym zrobić coś w rodzaju, że te a1 zostaje zastąpione jakoś.. właśnie - jak?
Da się bez robienia ifów lub switcha? Tak jak dla tablicy jakaś zmienna może być indeksem - czy tu też da się coś osiągnąć?

0

nie mam na razie pojęcia o co pytasz, ani jak chcesz żeby etykiety się zmieniały, ale na ostatnie pytanie być może odpowiedzią jest HashMap?

0

Jesli dobrze zrozumialem, chodzi Ci o mozliwosc czegos takiego w akcji klikniecia:

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test
	extends JFrame
	{
	public Test()
		{
		setLayout(new FlowLayout());
		setSize(400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		for (int i = 1; i <= 8; ++i)
			{
			JButton button = new JButton("pusty");
			button.addActionListener(new ActionZmienTekst());
			add(button);
			}
		
		}
	private class ActionZmienTekst
		extends AbstractAction
		{
		@Override public void actionPerformed(ActionEvent event)
			{
			JButton button = (JButton)event.getSource();
			button.setText("" + System.currentTimeMillis());
			repaint();
			}
		}
	public static void main(String[] args)
		{
		EventQueue.invokeLater(new Runnable()
			{
			@Override public void run()
				{
				Test okno = new Test();
				okno.setVisible(true);
				}
			});
		}
	}

Kluczowa linijka realizujaca to, czego potrzebujesz, to JButton button = (JButton)event.getSource(); w akcji klikniecia

0

VGT, dziękuję baaardzo :) Dokładnie o to chodziło!

Jednak problem powrócił później - powiedzmy, że mam potem innego ActionListenera, który i tak będzie zmieniał określone pola tekstowe/przyciski.
Więc abstrahując od sensu i logiki istnienia stu tysięcy przycisków, mam w nim takie coś:

 
c1.setLabel(Character.toString(wynik1.charAt(0)));
c2.setLabel(Character.toString(wynik1.charAt(1))); 
c3.setLabel(Character.toString(wynik1.charAt(2)));
c4.setLabel(Character.toString(wynik1.charAt(3)));
c5.setLabel(Character.toString(wynik1.charAt(4)));

(tylko, że jest tego więcej jak 5)
i pytanie wraca - czy w tym wypadku też da się zrobić jakiś skrót? Coś w jak c[i], gdzie i się zmienia, ale rzecz jasna wiem, że w ten sposób nie przekonwertuję takich zmiennych na Button.
Czy zostaje tylko praca ręczna?

0

W zasadzie ciezko domyslec sie, co chcesz uzyskac. Utworzone przyciski mozesz przechowywac chocby w jakiejkolwiek liscie i wtedy bedzie mozliwa iteracja po takiej kolekcji. Przerobiona wersja poprzedniego przykladu ponizej. Jednak skoro piszesz, ze zmieniac bedziesz okreslone przyciski, w jakis sposob definiujesz, ktore przyciski to beda. Jesli wszystkie, to ok - ponizszy kod Ciebie zadowoli, ale jesli warunki sa inne, to juz sie to nie przyda. Dlatego jak na moj gust, na razie problem jest zbyt abstrakcyjny, aby moc skutecznie pomoc.

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test
        extends JFrame
        {
        private List<JButton> buttonList = new ArrayList<JButton>();
        public Test()
                {
                setLayout(new FlowLayout());
                setSize(400, 300);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                for (int i = 1; i <= 8; ++i)
                        {
                        JButton button = new JButton("pusty");
                        button.addActionListener(new ActionZmienTekst());
                        add(button);
                        buttonList.add(button);
                        }
                
                }
        private class ActionZmienTekst
                extends AbstractAction
                {
                @Override public void actionPerformed(ActionEvent event)
                        {
                        for (int i = 0; i < buttonList.size(); ++i)
                        	buttonList.get(i).setText("" + System.currentTimeMillis());
                        repaint();
                        }
                }
        public static void main(String[] args)
                {
                EventQueue.invokeLater(new Runnable()
                        {
                        @Override public void run()
                                {
                                Test okno = new Test();
                                okno.setVisible(true);
                                }
                        });
                }
        }
0

OK, generalnie problem wygląda tak, że mam do zrobienia śmieszny projekt, łamigłówkę, która polega na zobrazowanym mnożeniu pod kreską - pierwsza liczba jest 4 cyfrowa, druga liczba jest 3 cyfowa. Każdej cyfrze z liczby odpowiada jeden przycisk - użytkownik klikając go - zmienia jego etykietę (i wartość zmiennej w tablicy, którą potem wykorzystuję) na 0-9. Wszystkie pola - a raczej przyciski (również te, których użytkownik nie zmienia sam) muszą być parzyste lub nieparzyste.

Pierwszy krok dla użytkownika to wybranie wartości dla 2 pierwszych liczb:

45648049.png

Drugi obraz pokazuje już po wybraniu:

23125334.png

I trzeci - po kliknięciu sprawdź - wszystkie buttony podświetlają się na kolor zielony, jeśli cyfra jest zgodna ze swoją ustaloną parzystością, bądź czerwony, jeśli nie jest.

29537796.png

Generalnie denerwuje mnie, że nie mogę tego zrobić inaczej, niż korzystając z tylu przycisków. Każdy przycisk ma kolejno zmienną a1, a2, a3, a4 itd. Dlatego pytałem o hurtowe zmiany - w tym wypadku tła - bo muszę dla przycisków od a1 do a28 zmienić tło na czerwone lub zielone, w zależności, czy cyfra na etykiecie jest parzysta/nieparzysta (zgodna z początkowymi x lub o - x to nieparzyste, o to parzyste).

Niestety załączony przykład przez Ciebie chyba mi do tego nie zadziała, ale dziękuję za pomoc i zaangażowanie. W najgorszym wypadku zostawie to tak jak jest.

0

OK, trzeba przyznac, ze zadanie nietypowe ;)

Na szybko raczej nie mam zadnej koncepcji na to, jak wygodnie zautomatyzowac wypelnianie cyframi poszczegolnych buttonow podczas prezentacji obliczania wyniku, ale tego nie podajesz, jako problem do rozwiazania, wiec zakladam, ze to juz dziala i jest akceptowalne reczne dlubanie poszczegolnych buttonow?

Jesli chodzi o sama zmiane kolorow, to jednak moj poprzedni kod po przerobkach da sie zastosowac.

Nie wiem, w jaki sposob zapamietujesz kwestie tego, czy dany button mial miec liczby parzyste, czy nieparzyste. Ja w ponizszym przykladzie zrobilem wlasna klase rozszerzejaca JButton, gdzie w konstruktorze podaje jakich cyfr przycisk oczekuje. Teraz majac te buttony w kolekcji, po wywolaniu akcji sprawdzenia moge dla kazdego buttona sprawdzic, jakie liczby mial przechowywac, jaka liczba sie w nim znajduje i w efekcie nadac oczekiwany kolor tla.

Wiec ponownie ze wzgledu na kilka niewiadomych moj kod raczej tylko pogladowo, ale moze na cos sie przyda.

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test
        extends JFrame
        {
        private List<MyButton> buttonList = new ArrayList<MyButton>();
        public Test()
                {
                setLayout(new FlowLayout());
                setSize(400, 300);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                for (int i = 1; i <= 8; ++i)
                        {
                        
                        MyButton button = new MyButton(i % 2 == 0);
                        button.addActionListener(new ActionZwiekszCyfre());
                        add(button);
                        buttonList.add(button);
                        }
                
                JButton buttonVerify = new JButton("Sprawdź");
                buttonVerify.addActionListener(new ActionVerify());
                add(buttonVerify);
                }
        private class ActionVerify
        	extends AbstractAction
        	{
			@Override public void actionPerformed(ActionEvent arg0)
				{
				for (int i = 0; i < buttonList.size(); ++i)
					{
					MyButton button = buttonList.get(i);
					button.changeBackgroundColor();
					}
				repaint();
				}
        	}
        private class ActionZwiekszCyfre
                extends AbstractAction
                {
                @Override public void actionPerformed(ActionEvent event)
                        {
                        MyButton button = (MyButton)event.getSource();
                        button.increaseDigit();
                        repaint();
                        }
                }
        public static void main(String[] args)
                {
                EventQueue.invokeLater(new Runnable()
                        {
                        @Override public void run()
                                {
                                Test okno = new Test();
                                okno.setVisible(true);
                                }
                        });
                }
        }

class MyButton
	extends JButton
	{
	private boolean even = false;
	private int number = 0;
	public MyButton(boolean even)
		{
		this.even = even;
		if (even)
			setText("X");
		else
			setText("O");
		}
	public boolean isEven()
		{
		return even;
		}
	public int getDigit()
		{
		return number;
		}
	public void changeBackgroundColor()
		{
		if (verifyDigit() == true)
			setBackground(Color.GREEN);
		else
			setBackground(Color.RED);
		}
	public void increaseDigit()
		{
		number = (number + 1) % 10;
		setText("" + number);
		}
	private boolean verifyDigit()
		{
		if (
				(isEven() && getDigit() % 2 == 0)
				|| (isEven() == false && getDigit() % 2 == 1)
			)
			return true;
		else
			return false;
		}
	}
0

Jestem nieco zszokowany ;)
Kurcze - okazało się, ze rozwiązanie moich problemów jest dużo prostsze - naprowadziłeś mnie z tymi arraylist.. i zrobiłem zwyczajną tablicę Buttonów - nie wiedziałem, że można :O
No, ale teraz wszystko ładnie działa, tam gdzie chcę zrobić optymalniej, po prostu pętla po a[i] i tyle :)
Dzięki serdeczne za poświęcony czas!

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