Pobranie zmiennej z ActionListener

0

Witam. Mam kod, jak poniżej:

  status.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent actionevent) 
            {
                JComboBox status = (JComboBox) actionevent.getSource();
                String stat = (String)status.getSelectedItem();
            }
        });

Jak pobrać String stat aby móc go wykorzystać w innym miejscu programu?

0
String stat;
status.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent actionevent) 
            {
                JComboBox status = (JComboBox) actionevent.getSource();
                stat = (String)status.getSelectedItem();
            }
        });

dodanie znacznika <code class="java"> - fp

0

Mam błąd:

Rozliczenie.java:120: error: local variable stat is accessed from within inner class; needs to be declared final

W linijce:

stat = (String)status.getSelectedItem();

Jeśli zmienię:String stat: na final String stat; to dostaję:

Rozliczenie.java:120: error: cannot assign a value to final variable stat

1

Najprościej jest zrezygnować z anonimowej implementacji na rzecz klasy wewnętrznej


status.addActionListener(myStatListener);
//...
private class MyStatListener implements ActionListener() 
        {
         public String stat;         

   public void actionPerformed(ActionEvent actionevent) 
            {
                JComboBox status = (JComboBox) actionevent.getSource();
                stat = (String)status.getSelectedItem();
            }
        }

W momencie wywołania listenera ustawiane jest stat. Później w kodzie możesz pobrać ostatnią ustawioną wartość za pomocą myStatListener.stat.

Inną opcją jest stworzenie czegoś w rodzaju obiektu transportowego:

final String stat[] = new String[1];
status.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent actionevent) 
            {
                JComboBox status = (JComboBox) actionevent.getSource();
                stat[0] = (String)status.getSelectedItem();
            }
        });

I odwołanie się do obiektu poprzez tablicę.

0

Dlaczego w pierwszej linijce pierwszego ze sposobów otrzymuję:

Rozliczenie.java:116: error: illegal start of expression

?

linijka 116:

private class MyStatListener implements ActionListener() 
0

Moze brakowac gdzies czegos, sprawdz czy nie brakuje { albo }, czy wszystkie petle i metody sa podomykane.

0

wygląda na to, że wszystko podomykane bo jak to, co powyżej zakomentuję to jest ok

@bogdans nawiasy są w poście @Koziołek. Padłem ofiarą copy/paste ale ich brak nie zmienia komunikatu błędu.

0

Taki kod jest poprawny:

private class MyStatListener implements ActionListener  //bez nawiasów!
{
    public String stat;         
    public void actionPerformed(ActionEvent actionevent) 
    {
        JComboBox status = (JComboBox) actionevent.getSource();
        stat = (String)status.getSelectedItem();
    }
}

Musiałeś go wpisać w niewłaściwym miejscu.

0

Chyba nie umiem. Poniżej całość moich "wypocin":


public class Rozliczenie extends JFrame 
{
	private JButton b1;
	private JButton b2;
	private JTextField t;
	public JTextField t1;
	public JComboBox pracownik;
	public JComboBox status;
	private TextArea pole1;
        
	public Rozliczenie() 
	{
		setTitle("ROZLICZNIK");
		setLayout(null);
		setLocation(280, 200);			  		
		setVisible(true);
		setSize(750,450);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setBackground(Color.gray);
		
		JLabel label1 = new JLabel();
		label1.setBounds(650,10,80,80);
		add(label1);
		label1.setIcon(new ImageIcon("logo.gif"));

		JLabel tytul= new JLabel("Rozliczenie");
		tytul.setBounds(310,20,400,30);
		tytul.setForeground (Color.white);
		add(tytul);
		add(t=new JTextField(8));
		
		JLabel label2 = new JLabel("Pracownik");
		label2.setBounds(120,130,80,30);
		label2.setForeground (Color.white);
		add(label2);
						
		b1=new JButton("Zatwierdź");
		b1.setBounds(280,305,150,30);
		b1.setBackground (Color.green);
		add(b1);
		
		b2=new JButton("Powrót");
		b2.setBounds( 280,355,150,30);
		b2.setBackground (Color.green);
		add(b2);
		
		final JTextField t1=new JTextField("Data");
		t1.setBounds(360,170,150,30);
		t1.setBackground (Color.lightGray);
		DateFormat d= new SimpleDateFormat("dd.MMMMM ");
		Date today = Calendar.getInstance().getTime();        
		String wyswietlDate = d.format(today);
		t1.setText("   " + wyswietlDate); 
		t1.setEditable(false);
		add(t1);
		String kalendarz=t1.getText();
		
		JLabel label3 = new JLabel("Data");
		label3.setBounds(415,130,80,30);
		label3.setForeground (Color.white);
		add(label3);
		
		JLabel label4 = new JLabel("Status");
		label4.setBounds(585,130,80,30);
		label4.setForeground (Color.white);
		add(label4);

		pracownik = new JComboBox();
		Connection c = null;
		Statement stmt = null;
		try
		{
			Class.forName("org.postgresql.Driver");
			c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/jacek","jacek", "zuza");
			c.setAutoCommit(false);
			System.out.println("Dostęp do bazy danych \n");
 
			stmt = c.createStatement();
			ResultSet rs = stmt.executeQuery( "select id_pracownika,nazwisko,imie from pracownicy;" );
					pracownik.addItem(" \n");		
			while ( rs.next() ) 
			{
					pracownik.addItem(rs.getInt("id_pracownika" )+ " "  + rs.getString(   "imie") + " " + rs.getString("nazwisko"));
			}    
			rs.close();
			stmt.close();
			c.close();
		}    
		
		catch ( Exception e )
		{
			System.err.println( e.getClass().getName()+": "+ e.getMessage() );
			System.exit(0);
		}        
		pracownik.setBounds(60,170,250,30);
		pracownik.setBackground(Color.lightGray);
		add(pracownik);
				
		String statusy []={" ","obecny","nieobecny","urlop","chory","dzien_wolny"};
		status = new JComboBox(statusy);
		status.setBounds(565,170,120,30);
		status.setBackground(Color.lightGray);
		status.setSelectedIndex(0);
		status.addActionListener(myStatListener);
		add(status);

		/////////////-------------Tutaj to wstawiłem.

		private class MyStatListener implements ActionListener 
		{
			public String stat;         
			public void actionPerformed(ActionEvent actionevent) 
			{
				JComboBox status = (JComboBox) actionevent.getSource();
				stat = (String)status.getSelectedItem();
			}
		}
	
		b1.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e)
			{
				
			}	
		});     
				
		b2.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e)
			{
				dispose();
				Program okno=new Program();
				okno.setVisible(true);
			}
		});
	}
	
	public static void main(String args[]) 
	{
		new Rozliczenie();
	}
}

Proszę o sugestie.

1

Źle wstawiłeś, definicja klasy jest wewnątrz ciała metody (konstruktora). Przenieś definicję klasy np. przed ostatni zamykający nawias klamrowy.

0

Chyba brakuje mi podstaw, bo po przeniesieniu tego błąd mam w linijce:

status.addActionListener(MyStatListener);

error: cannot find symbol

Czytałem:

http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

ale nie wiem gdzie powinienem wstawiać to, co jest w pkt.2.

0

Zamień

status.addActionListener(MyStatListener);

na

status.addActionListener(new MyStatListener());
0

Problem rozwiązany. - też na to wpadłem po przeczytaniu kilku forów.

0

Zbyt szybko odtrąbiłem sukces... W klasie dostaję aktualną wartość z ComboBoxa a poza nią tylko defaultową czyli null. Jest jakiś sposób na update wartości?

0

W klasie dostaję aktualną wartość z ComboBoxa a poza nią tylko defaultową czyli null

W jakiej klasie dostajesz aktualną wartość? I co nazywasz aktualną wartością?

0

Jeśli zrobię tak:

    public class StatusListener implements ActionListener 
    {       
        public String stat;   
        public void actionPerformed(ActionEvent actionevent) 
        {
            JComboBox status = (JComboBox) actionevent.getSource();
            stat = (String)status.getSelectedItem();    
            System.out.println( " " +stat);    
        }
    }

to dostaję wartośc dopiero po wybraniu czegokolwiek i wartość zawsze aktualną. Niestety nie mam do wartości dostępu poza klasą.

Jesli zaś w zrobię w ciele metody:

status.addActionListener(new StatusListener()); 
add(status);
StatusListener Sl = new StatusListener();
System.out.println(" " + Sl.stat);

to zawsze mam wartość startową czyli null. Dodatkowo nie reaguje na zmiany przy wyborze czegokolwiek w combo.

0

Omg, Ty rozumiesz cokolwiek z kodu, który piszesz?

status.addActionListener(new StatusListener()); 
add(status);
StatusListener Sl = new StatusListener();
System.out.println(" " + Sl.stat);

Przecież Sl w trzecim i czwartym wierszu, to coś zupełnie innego niż dodany w pierwszym wierszu słuchacz. Musi być tak:

StatusListener Sl = new StatusListener();
status.addActionListener(Sl); 
add(status);
....
System.out.println(" " + Sl.stat);
0
bogdans napisał(a):

Omg, Ty rozumiesz cokolwiek z kodu, który piszesz?

No właśnie jak widać...

bogdans napisał(a):

Przecież Sl w trzecim i czwartym wierszu, to coś zupełnie innego niż dodany w pierwszym wierszu słuchacz. Musi być tak:

StatusListener Sl = new StatusListener();
status.addActionListener(Sl); 
add(status);
....
System.out.println(" " + Sl.stat);

Tak też jest null od razu na starcie programu.

0

Omg, specjalnie napisałem kropki, żebyś nie wywoływał od razu, dopiero po dokonaniu wyboru z JComboBoxa. A jak chcesz od razu, to

    public class StatusListener implements ActionListener 
    {       
        public String stat = "Nic nie rozumiem";   
        public void actionPerformed(ActionEvent actionevent) 
        {
            JComboBox status = (JComboBox) actionevent.getSource();
            stat = (String)status.getSelectedItem();    
            System.out.println( " " +stat);    
        }
    }
0
bogdans napisał(a):

(...)żebyś nie wywoływał od razu, dopiero po dokonaniu wyboru z JComboBoxa.(...)

Ten fragment wyjaśnia mi więcej niż kilka dni szukania... Dziękuję.

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