Problem z listą

0
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.BorderFactory.*; 
import javax.swing.border.Border;

 
public class zadanie10 extends JFrame implements ActionListener
{   
    JList lista;
    JLabel naglowek, wynik;
    JRadioButton kl1,kl2;
    JPanel p1;
    JButton zamknij;
    public zadanie10()
    {
    	super("Sprzedaz biletow");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setBounds(200,200,300,300);
    	setLayout(null);
    	
    	naglowek = new JLabel("Sprzedaz biletow");
    	naglowek.setBounds(10,10,280,40);
    	naglowek.setFont(new Font("a",Font.ITALIC,25));
    	naglowek.setForeground(Color.blue);
    	add(naglowek);
    	
		String[] listaString = {"Osobowy" ,"Pośpieszny" , "Express" };
		lista = new JList (listaString);
		lista.setBounds(5,90,120,60);
		lista.setSelectedIndex(0);
    	
    	add(lista);
    	
    	p1= new JPanel();
    	p1.setBounds(140,60,100,90);
    	
    	kl1= new JRadioButton("Klasa I");
    	kl1.setBounds(10,10,80,20);
    	kl1.addActionListener(this);
    	kl1.setEnabled(true); 
    	p1.add(kl1);
    	
    	kl2= new JRadioButton("Klasa II");
    	kl2.setBounds(10,40,80,20);
    	kl2.setSelected(true);
    	kl2.setEnabled(true);
    	p1.add(kl2);
    	
    	ButtonGroup grupa = new ButtonGroup();
    	grupa.add(kl1);
    	grupa.add(kl2);
    	
    	Border ramka1 = BorderFactory.createTitledBorder("Klasy");
        p1.setBorder(ramka1);
        
    	add(p1);
    	
    	wynik= new JLabel("Cena biletu: ");
    	wynik.setBounds(20,200,100,40);
    	wynik.setFont(new Font("c",Font.ITALIC,17));
    	add(wynik);
    	
    	zamknij= new JButton("Zamknij");
    	zamknij.setBounds(160,160,100,30);
    	zamknij.addActionListener(this);
    	add(zamknij);
    }   
    public void actionPerformed (ActionEvent e) 
    {

    	int wybor=lista.getSelectedIndex();
    	    
    	 if(e.getSource()==lista)
    	 {  
		 	double bilet=0; 
    	 	switch (wybor)
    	 	{
    	 		case 0:
    	 			bilet+=12.20;
    	 	        
    	 	        break;
    	 			    	            
    	 		case 1:
    	 			bilet+=19.30;
    	 	        			
    	 			break;
    	 			
    	 		case 2:
    	 			bilet+=22.40;
    	 			
    	 			break;
    	 			
    	 	}
    	 	if(kl2.isSelected())
    	            {
    		        wynik.setText(String.valueOf(bilet)+" PLN");
    	            }
    	 	if(kl1.isSelected()) 
    	            {
    		        bilet=bilet*1.11;
    		        wynik.setText(String.valueOf(bilet)+" PLN");
    	            } 
    	 		  	 	
    	 }
    	 
    	if(e.getSource()==zamknij)
    	{
    		System.exit(-1);
    	}
    }
    
    public static void main(String[] args) {
    	
    	zadanie10 p= new zadanie10();
    	p.setVisible(true);
    }
}

Problem jest taki, że nie wyświetla ceny. Program miał za zadanie po włączeniu wyświetlać cenę Osobowego, a przy zmianie na inny typ pociągu cena miała się zmieniać. Gdzie jest błąd?

0

Aby na starcie była jakaś cena, to zmień odpowiedni wiersz na taki

wynik= new JLabel("Cena biletu: 12 PLN");

Żeby się potem zmieniało musisz dodać do listy ListSelectionListenera. Większość kodu z metody actionPerformed() przenieś do metody valueChanged() tego nowego listenera.

0

No właśnie w tym problem, że nie wiem jak dodać ListSelectionListenera :/ Pomógłbyś mi?

0

Na początku pliku

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.BorderFactory.*;
import javax.swing.border.Border;

public class zadanie10 extends JFrame implements ActionListener,ListSelectionListener

w konstruktorze

     String[] listaString = {"Osobowy" ,"Pośpieszny" , "Express" };
     lista = new JList (listaString);
     lista.setBounds(5,90,120,60);
     lista.setSelectedIndex(0);
     lista.addListSelectionListener(this);

nowa metoda

    public void valueChanged(ListSelectionEvent e)
    {
           double bilet=0;
           int wybor=lista.getSelectedIndex();
           switch (wybor)
           {
                 case 0:
                       bilet=12.20;
                       break;
                 case 1:
                       bilet=19.30;
                       break;
                 case 2:
                       bilet=22.40;
                       break;
           }
           if(kl2.isSelected())
           {
                  wynik.setText(bilet+" PLN");
           }
           if(kl1.isSelected())
           {
                   bilet*=1.11;
                   wynik.setText(bilet+" PLN");
           }
    }
0
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.BorderFactory.*;
import javax.swing.border.Border;
 
public class zadanie10 extends JFrame implements ActionListener,ListSelectionListener
{   
    JList lista;
    JLabel naglowek, wynik;
    JRadioButton kl1,kl2;
    JPanel p1;
    JButton zamknij;
    public zadanie10()
    {
    	super("Sprzedaz biletow");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setBounds(200,200,300,300);
    	setLayout(null);
    	
    	naglowek = new JLabel("Sprzedaz biletow");
    	naglowek.setBounds(10,10,280,40);
    	naglowek.setFont(new Font("a",Font.ITALIC,25));
    	naglowek.setForeground(Color.blue);
    	add(naglowek);
    	
		String[] listaString = {"Osobowy" ,"Pośpieszny" , "Express" };
		lista = new JList (listaString);
		lista.setBounds(5,90,120,60);
		lista.setSelectedIndex(0);
		lista.addListSelectionListener(this);
    	
    	add(lista);
    	
    	p1= new JPanel();
    	p1.setBounds(140,60,100,90);
    	
    	kl1= new JRadioButton("Klasa I");
    	kl1.setBounds(10,10,80,20);
    	kl1.addActionListener(this);
    	kl1.setSelected(true);
    	kl1.setEnabled(true); 
    	p1.add(kl1);
    	
    	kl2= new JRadioButton("Klasa II");
    	kl2.setBounds(10,40,80,20);
    	kl2.setEnabled(true);
    	p1.add(kl2);
    	
    	ButtonGroup grupa = new ButtonGroup();
    	grupa.add(kl1);
    	grupa.add(kl2);
    	
    	Border ramka1 = BorderFactory.createTitledBorder("Klasy");
        p1.setBorder(ramka1);
        
    	add(p1);
    	
    	wynik= new JLabel("Cena biletu: 13.54 PLN");
    	wynik.setBounds(20,200,200,40);
    	wynik.setFont(new Font("c",Font.ITALIC,17));
    	add(wynik);
    	
    	zamknij= new JButton("Zamknij");
    	zamknij.setBounds(160,160,100,30);
    	zamknij.addActionListener(this);
    	add(zamknij);
    }
    
    public void valueChanged(ListSelectionEvent e)
    {
           double bilet=0;
           int wybor=lista.getSelectedIndex();
           switch (wybor)
           {
                 case 0:
                       bilet=12.20;
                       break;
                 case 1:
                       bilet=19.30;
                       break;
                 case 2:
                       bilet=22.40;
                       break;
           }
           
           if(kl1.isSelected())
           {
                  bilet*=1.11;
                  wynik.setText("Cena biletu: "+bilet+" PLN");
           }
           
           if(kl2.isSelected())
           {
                  wynik.setText("Cena biletu: "+bilet+" PLN");
           }

    }  
    	 
    public void actionPerformed (ActionEvent e) 
    {
		if(e.getSource()==zamknij)
    	{
    		System.exit(-1);
    	}
    }
    
    public static void main(String[] args) {
    	
    	zadanie10 p= new zadanie10();
    	p.setVisible(true);
    }
}

Wielkie dzięki, działa.

Tylko jeszcze 2 rzeczy:

  1. Jak zaokrąglić liczbę do 2 miejsc po przecinku (chodzi mi o wynik mnożenia bilet*1.11).
  2. Przy zamianie Klasy przejazdu wartość bilet się nie zmienia. Przyjmuje poprawną wartość dopiero po zmianie typu pociągu na inny i powrót do tego samego. Jak zrobić by się zmieniało od razu przy zmianie klasy?
0

Dodałeś ActionListener dla kl1, a gdzie jest ten dla kl2? Poza tym ta sama metoda obsługuje również przycisk zamknij, ale reaguje tylko na ten ostatni.

Ja bym przerobił tak:

//...
	private float bilet;
	private boolean pośpieszny;
//...
	public void actionPerformed (ActionEvent e)
	{
		Object x = e.getSource();
		if(x == zamknij)
		{
			dispose(); //komunikat zamknięcia okna programu
			return; //bez odświeżenia
		}
		pośpieszny = x == kl1; //true jeżeli wybrano kl1, przeciwnie false
		odśwież();
	}
	public void valueChanged(ListSelectionEvent e)
	{
		switch(lista.getSelectedIndex())
		{
		case 0: bilet = 12.20; break;
		case 1: bilet = 19.30; break;
		case 2: bilet = 22.40; break;
		}
		odśwież();
	}
	private void odśwież()
	{ //wyliczenie dokładne i zaokrąglenie dopiero przy wyświetlaniu
		float suma = bilet * (pośpieszny ? 1.11 : 1.0);
		wynik.setText(String.format("Cena biletu: %.2f PLN", suma));
	}

Polecenia obsługi zdarzeń nie powinny samodzielnie na wątku AWT-event przeprowadzać jakichkolwiek czasochłonnych obliczeń aplikacji. Powinny zmieniać tylko stan zmiennych aplikacji, które są dla niej danymi wejściowymi. Dlatego bilet i pośpieszny, powinny być polami klasy i powinny być danymi wejściowymi dla metody odśwież(). Ona z kolei uaktualnia tylko stan wyniku, a przeprowadzane obliczenia są banalne, dlatego jest uruchamiana z każdej metody obsługi zdarzeń, która może na wynik wpłynąć. Gdyby obliczenia były bardzo czasochłonne, to powinny być umieszczone na innym wątku, którego zakończenie powinno kończyć się przez np. SwingUtilities.invokeLater() ostatecznie wywołującym wynik.setText(). odśwież() powinna być również wywołana tuż po skonstruowaniu wszystkich elementów jako inicjator stanu dla pola wynik.

Co do System.exit(-1) - poprawne wartości dla większości systemów to 0..255. -1 jest obcinane i traktowane jako 255 lub największa liczba dodatnia. A ma ona reprezentować kod błędu. Zero oznacza brak błędu aplikacji. Dlatego należałoby mieć System.exit(0). Dispose() jest równie skuteczne i na dodatek zalecane bo nie każde zamknięcie okienka toplevel (a można mieć ich kilka) musi zamykać cała aplikację.

Na koniec polecałbym edytor graficzny w netbeans. Za jego pomocą wyklikanie takiego programu to jakieś 2 minuty zabawy, w tym wpisanie tylko tych wierszy kodu, które podałem. Pisanie ręcznie setBounds(), to czasowa masakra.

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