Java jak pobrac zmienna z actionListenera

0

Witam,
Tworze programik i zawiesiłem się.

suwak1 = new JSlider();
      suwak1.setValue(1);
      suwak1.setBorder(BorderFactory.createTitledBorder("Alfa"));
      add(suwak1,BorderLayout.NORTH);
      suwak1.addChangeListener(new ChangeListener(){
         public void stateChanged (ChangeEvent e) {
             a = suwak1.getValue();
            }
         
      });

Mam taki fragment kodu i nie wiem jak zmusić program aby widział ta zmienna a poza Listenerem. Co jeszcze muszę dopisać, z góry dzięki za pomoc.

0
class Cośtam{
   private int a;


   public void metoda(){
//...
suwak1 = new JSlider();
      suwak1.setValue(1);
      suwak1.setBorder(BorderFactory.createTitledBorder("Alfa"));
      add(suwak1,BorderLayout.NORTH);
      suwak1.addChangeListener(new ChangeListener(){
         public void stateChanged (ChangeEvent e) {
             setA(suwak1.getValue());
            }
         
      });

   }
public void setA(int a){this.a = a;}
public int getA(int a){return a;}
}

BTW, obserwator to fajny wzorzec projektowy tu się sprawdzi.

0

Koziolek, a skad Ty wiesz ze obserwator sie sprawdzi, nie wiesz nawet co koles chce zrobic. Na podstawie wyrwanego z kontekstu kawalko kodu wiesz ze obserwator jest tutaj na miejscu (moze jest, moze nie, ale dam glowe ze nie umiesz tego powiedziec w tej chwili bez wiekszej wiedzy), wiec przestan (to juz kolejny taki post) udawac madrzejszego niz jestes i czarowac przez poczatkujacymi.

0

@Mech, nie udaję niczego. Po pierwsze jeżeli chcesz przekazywać zmienną poza listener można to zrobić tak jak pokazałem w kodzie, czyli wynieść ją poza listener jako pole klasy. Ta metoda sprawdzi się jeżeli nasza zmienna będzie miała sens jako pole w klasie lub jeżeli zależy nam na bardzo prymitywnym rozwiązaniu. Nie można tego zrobić przez przeniesienie zmiennej do metody w której tworzymy listener bo zmienna musiała by być final, a zatem nie ma możliwości ustawiania jej nowej wartości.
Poza tym w kodzie mamy do czynienia ze sliderem, czyli można z tego i z pytania wywnioskować, że zmiana wartości slidera ma być przekazywana do jakiegoś obiektu na zewnątrz w celu aktualizacji jego staniu. Jeżeli zatem mamy taki obiekt, którego stan ma być aktualizowany po zmianie stanu innego obiektu, ty slidera, samo przez się nasuwa się wzorzec obserwatora.

0

Nie tlumacz mi takich komunalow, rozumiem o co chodzi i jak to dziala. Chodzi mi o Twoje wnioski, daleko idace, a majace na celu napisanie byle czego. Jak chce takiego sluchacza zrobic to niech doda listenera do slidera a nie jakies cuda, po co pisac wlasne obserwatory. Fakt ze zadane jest tak banalne pytanie swiadczy o tym ze to newbie, i nie sadze ze wie co to obserwator, takiego czegos Ty zdajesz sie nigdy nie wywnioskowac.

0

Skoro nie wie to się dowie... Chyba forum jest po to by ludzie się czegoś uczyli a nie tylko czas marnowali.

0

Właśnie o to chodzi ze zmienna z suwaka ma być parametrem dla wzoru, i w zależności od zmiany suwaka ma się zmieniać wzór :) Jeśli mógłbym prosić o jakieś objaśnienie jak to działa byłbym wdzięczny. Bo jak na razie wklepałem to i próbuję przypisać do pola tekstowego i zobaczyć czy się zmienia i nic się nie dzieje :(

0

Nie o to pytal, a ty co drugi post uskuteczniasz zgaduj zgadule. Tym razem trafiles, ale wiekszosc gadasz bez sensu.

0

To ja się chciałem zapytać kto jest lepszym programistą: Koziołek czy miech? Bo teraz nie wiem komu wierzyć. Koziołek tu często pisze, więc myślałem, że jest dobry. Miecha nie kojarzę, więc nic nie mogę powiedzieć. No ale to się okazuje, że Koziołek tylko udaje mądrzejszego? To kto ma rację?

0

Nie o to chodzi kto jest lepszy, Koziolek to bardzo dobry programista, tyle ze strasznie dziala mi na nerwy jak pisze wiecej niz jest w stanie powiedziec majac opisany (lub nie) kontekst, tak jak w tym przypadku. Czesto gesto maci w glowach i tak juz zmieszanych newbie.
Miech ma wiele imion, i pisze niemal rownie czesto jak Koziolek ;d

Na marginesie, czy ten powyzszy post to jakas prowokacja? Bo az mi sie nie chce wierzyc ze ktos zapytal tutaj "kto jest lepszy", jakos tak jak czytalem to mi nie pasuje ten wpis zupelnie do tego forum.

0

Panowie a czy zamiast się kłócić nie postaralibyście się pomoc biednemu małemu newbie :)

0
package test;


import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class SliderTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        JSlider slider = new JSlider(0, 100, 10);
        WzorZaleznyOdWartosciSlidera wzor = new WzorZaleznyOdWartosciSlidera("x + 17", 'x');
        slider.addChangeListener(new ZmieniaczWzoru(wzor));
        frame.add(slider);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}


class WzorZaleznyOdWartosciSlidera {

    private String wzor;

    private char zmienna;

    private Integer val;

    public WzorZaleznyOdWartosciSlidera(String wzor, char zmienna) {
        this.wzor = wzor;
        this.zmienna = zmienna;
    }

    public void print() {
        if (val == null) {
            System.out.println(wzor);
        } else {
            System.out.println(wzor.replaceAll("" + zmienna, val.toString()));
        }
    }

    public void setVal(Integer val) {
        this.val = val;
        print();
    }
}


class ZmieniaczWzoru implements ChangeListener {

    private WzorZaleznyOdWartosciSlidera wzor;

    public ZmieniaczWzoru(WzorZaleznyOdWartosciSlidera wzor) {
        this.wzor = wzor;
    }

    @Override
    public void stateChanged(ChangeEvent evt) {
        Integer val = (((JSlider)evt.getSource()).getValue());
        wzor.setVal(val);
    }
}

Podales bardzo malo informacji wiec nie wiem czy o to chodzi.
Moj przyklad tworzy jakistam wzor ze zmienna, we wzorze mozna pod zmienna podstawiac wartosc (nic szczegolnego, zwykle podmienianie stringow). Dodatkowo tworziny jest obserwator / listener ktory ma referencje do wzoru ktory ma byc zmieniany wraz ze zmiana wartosci slidera. Obserwator jest dodany do JSlidera, i gdy wartosc jest zmieniana to ustawiana jest we wzorze. Metoda setVal wola metode print ktora wypisuje na konsole aktualny wzor, abys widzial ze to dziala.
I tak, nie trzeba tworzyc zadnych wlasnych implementacji obserwatora, nie trzeba tez wystawiac nigdzie nowych wartosci slidera, wszystko "dzieje sie samo".

0

Dziękuje :* [browar]

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