[java] Przyciski - problem

0

Witam
Napisalem taki kod:

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

public class Rozmowa implements ActionListener
{
 JPanel panel;
 JFrame frame;
 JTextField argument;
 JLabel wynik;
 JButton zamiana, zapis, odczyt, zamknij;
  
 public Rozmowa()
 {
   frame = new JFrame("cos");
   frame.setSize(500, 350);
   panel = new JPanel();
   panel.setLayout(null);
   frame.getContentPane().add(panel);
 
    // utworzenie komponentow
   
    argument = new JTextField(3);
    argument.setBounds(180,180,150,18);
    
    zamiana = new JButton("OK"); // przycisk 
    zamiana.setBackground(Color.yellow);
    zamiana.setForeground(Color.black);
    zamiana.setBounds(340,180,60,18);
       
    odczyt = new JButton("Wczytaj"); // przycisk
    odczyt.setBackground(Color.yellow);
    odczyt.setForeground(Color.black);
    odczyt.setBounds(20,225,100,18);
           
    zapis = new JButton("Zapis"); // przycisk
    zapis.setBackground(Color.yellow);
    zapis.setForeground(Color.black);
    zapis.setBounds(20,250,100,18);

    zamknij = new JButton("Zamknij"); // przycisk
    zamknij.setBackground(Color.yellow);
    zamknij.setForeground(Color.black);
    zamknij.setBounds(20,275,100,18);

   wynik = new JLabel("");
   wynik.setBounds(100,90,150,50);
    //dodanie komponentow do panelu
    panel.add(argument);
    panel.add(zamiana);
    panel.add(zapis);
    panel.add(odczyt);
    panel.add(zamknij);
    panel.add(wynik);
   
    //nas. zdarzenie z przycisku "zamiana"
    odczyt.addActionListener(this); 
    frame.setVisible(true);
  
   // obsluga zdarzenia (zamkniŕcie okna)
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.out.println("Dziekujemy za prace z programem...");
    System.exit(0);
      }
    });

    
  }
  
 // definicja metody obslugujacej zdarzenie (nacisniecie przycisku)
  public void actionPerformed(ActionEvent e) {
    try {
       String line;
       BufferedReader OdczytA = new BufferedReader(new FileReader("plik.txt"));
       
       while ((line = OdczytA.readLine()) != null) {
       wynik.setText("<html><Font Color=blue>" + line + "</html></Font");
       
//         System.out.println(line);
      }
      OdczytA.close();
         
    } catch(IOException ioE) {
        wynik.setText("<html><Font Color=red> Brak pliku!!! </html></Font");
    }
  }



public static void main(String[] args) {
    // zmiana wygladu na "Java Look&Feel"
    try {
   
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    } catch(Exception e) {}
      
    new Rozmowa();
  }
}

Nie wiem jak zrobic aby dzialal inny przycisk dziala jedynie ten ktory podaje "xxx" xxx.addActionListener(this); bo jedynie dziala mi odczyt.
Jak zrobic aby dzialala reszta przyciskow...
Prosze o pomoc
pozdrawiam
</span></span>

0

rozwiazanie:
Twoja klasa rozszerza interfejs ActionListener, co juz samo w sobie jest, że tak powiem, nie za bardzo dobrym pomysłem, lepiej by było, gdyby ona była extends JFrame.

a actionListenerea daj do kazdego przycisku osobno poprzez anonimowe klasy wewnętrzne:

guzik.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//...no i tutaj jakaś akcja, która wykona się po wciśnięciu guzika
}
});

jest to, wg. mnie rozwiazanie lepsze, bo w razie konieczności dokonania zmian modyfikujemy tylko mały fragment kodu

pzdr.

0

troche zmienilem wersje:

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

public class Rozmowa extends JFrame
{
 JPanel panel;
 JFrame okno;
 JButton b1, b2;

public Rozmowa()
 {
   okno = new JFrame("xxx");
   okno.setSize(500, 350);
   panel = new JPanel();
   panel.setLayout(null);
   okno.getContentPane().add(panel);	

    b1 = new JButton("OK"); // przycisk 
    b1.setBackground(Color.yellow);
    b1.setForeground(Color.black);
    b1.setBounds(340,180,60,18);

    b2 = new JButton("Wczytaj"); // przycisk
    b2.setBackground(Color.yellow);
    b2.setForeground(Color.black);
    b2.setBounds(20,225,100,18);
    
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

        try {
             
         
            } catch(IOException ioE) {  }

}
}

b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

}
});



panel.add(b1);
panel.add(b2);
okno.setVisible(true);



// obsluga zdarzenia (zamkniŕcie okna)
    okno.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.out.println("Dziekujemy za prace z programem...");
    System.exit(0);
    }
});

}

public static void main(String args[])
  {
   System.out.println("Start...");
   new Rozmowa();
  }
}

uruchamia sie ale wyskakuje blad

Rozmowa.java ')' expected
^
1 error
Exit code: 1
There were errors

nie wiem co oznacza...

0

no brakuje ' ); '

i tyle

0

Witam
wlasnie jak dodam');' to juz w ogóle kupa bledow wysakuje... a tam w tym try ma byc zapis do pliku...

0

no raczej, że pojawia się błąd przy pustym bloku try-catch, błąd ten sygnalizuje, że dany blok try-catch nigdy nie wyrzuci danego wyjątku, ale wpisz tam na przykład:

PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter("dane.txt")));

i juz powinno być miodzio :-)

ale lepiej jeszcze zrobić to tak: zamiast obsługiwać w samym actionListenerze funcję, daj tam tylko jej wywołanie, a samą funkcję zdefiniuj osobno, w ten sposób będziesz miał do niej dostęp również z innych miejsc twojego programu...

pzdr.

0

sorx ale jestem poczatkujacy...
jak ja mam taki to jak to podpiac pod przycisk:


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

public class Rozmowa extends JFrame
{
 JPanel panel;
 JFrame okno;
 JButton b1, b2;
 
 public Rozmowa()
 {
   okno = new JFrame("xxx");
   okno.setSize(500, 350);
   okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   panel = new JPanel();
   panel.setLayout(null);
   okno.getContentPane().add(panel);	

    b1 = new JButton("OK"); // przycisk 
    b1.setBackground(Color.yellow);
    b1.setForeground(Color.black);
    b1.setBounds(340,180,60,18);

    b2 = new JButton("Wczytaj"); // przycisk
    b2.setBackground(Color.yellow);
    b2.setForeground(Color.black);
    b2.setBounds(20,225,100,18);

//jak to ***************************************
String linia = "";
try{
   FileReader fr = new FileReader("1.txt");
   BufferedReader bfr = new BufferedReader(fr);
   while((linia = bfr.readLine()) != null){
      System.out.println(linia);
   }
} catch( IOException ex ){
   System.out.println("Brak pliku: "+ex);
}
//******************************************
    
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

// <- wstawic tu... (w funkcji)
    
}
});

b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

System.out.println("2");
}
});



panel.add(b1);
panel.add(b2);
okno.setVisible(true);



// obsluga zdarzenia (zamkniŕcie okna)
    okno.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.out.println("Dziekujemy za prace z programem...");
    System.exit(0);
    }
});

}

public static void main(String args[])
  {
   System.out.println("Start...");
   new Rozmowa();
  }
}
0
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class Rozmowa extends JFrame{
 JPanel panel;
 JFrame okno;
 JButton b1, b2;
 String linia = "";
 
 public Rozmowa() {
   okno = new JFrame("xxx");
   okno.setSize(500, 350);
   okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   panel = new JPanel();
   panel.setLayout(null);
   okno.getContentPane().add(panel);       

    b1 = new JButton("OK"); // przycisk
    b1.setBackground(Color.yellow);
    b1.setForeground(Color.black);
    b1.setBounds(340,180,60,18);

    b2 = new JButton("Wczytaj"); // przycisk
    b2.setBackground(Color.yellow);
    b2.setForeground(Color.black);
    b2.setBounds(20,225,100,18);
    b1.addActionListener(new ActionListener(){
    	public void actionPerformed(ActionEvent e){
    		Rozmowa.this.otworzPlik();
    		}
    });
    b2.addActionListener(new ActionListener(){
    	public void actionPerformed(ActionEvent e){
    		System.out.println("2");
    		}
    });
    panel.add(b1);
    panel.add(b2);
    okno.setVisible(true);
    
    // obsluga zdarzenia (zamkniŕcie okna)
    okno.addWindowListener(new WindowAdapter() {
    	public void windowClosing(WindowEvent e) {
    		System.out.println("Dziekujemy za prace z programem...");
    		System.exit(0);
    	}
    });
 }

public void otworzPlik(){
	try{
		   FileReader fr = new FileReader("1.txt");
		   BufferedReader bfr = new BufferedReader(fr);
		   while((linia = bfr.readLine()) != null){
		      System.out.println(linia);
		   }
		} catch( IOException ex ){
		   System.out.println("Brak pliku: "+ex);
		}
}
public static void main(String args[])
  {
   System.out.println("Start...");
   new Rozmowa();
  }
}

bitte
pzdr.

0

thx wielkie a wiesz moze jeszcze jak zrobic zeby kazda linie z pliku .txt wczytywal po kolei jak sie wcisknie przycisk?? czyli wciskam przycisk wczytuje linie wciskam jeszcze raz wczytuje 2 linie....
pozdrawiam

0

takie rozwiązanie jak proponujesz, bez urazy, ale nie ma za bardzo sensu (no chyba ze koniecznie tak ma być, to wtedy musisz wcisnąć tam jakis licznik, który bedzie się zwiekszal po w czytaniu kazdej linii i bedzie dana ilosc linii omijał) ale lepiej wczytaj sobie xcałośc od razu do StingBuffer'a i baw sie juz na tym dalej

pzdr.

0

wlasnie mi potrzebne test wczytywanie po linii...

pozdr.

0

no to robisz sobie gdzies jakąś zmienną 'n' typu int i po kazdym wcisnieciu przcisku inkrementujesdz ją. no i jak masz ten licznik, to wczytujesz np. petla for 'n' linii i nic z nimi nie robisz i dopiero z kolejną się bawisz, czyli z ta o którą Ci chodzi. wygladac to bedzie mniej wiecje tak:

int licznik=0;
public void wczytajLinie(){
//......otwarcie strumienia, etc...
licznik++;
String liniaTextu;
for(int i=0; i<licznik;i++){
liniaTextu=strumień.readLine();
}
//jak juz przelecimy (sic!) te linie które już 'były' to:
liniaTextu=strumień.readLine();
//i tu robisz cos z ta linia textu o która co chodzi...
//..zamkniecie strumiena, etc...
}

ale dlaczego nie wczytac całego textu od razu i nie operowac później na jakimś stringu czy strinbufferze??

pzdr.

0

a jak bys proponowal to zrobic uzywajac tej metody o ktorej piszesZ??

0

po jaką cholere wczytywać liniie które już były?

gdzieś publicznie wstawiasz:
BufferedReader in = new BufferedReader(new FileReader("plik");

potem dla każego wciśnięcia przycisku wywołujesz:
line = in.readLine();

należy trochę pokombinować żeby nie było problemów z prawami do podanych metod...

PS: jakby plik miał np.300MB to może być kretyńskim pomysłem wczytywanie całości do pamięci ram, prawda?

0

chodzi o to zeby np wczytal po kolei 5 pytan z pliku txt (kazde klikniecie to nowe pytanie) nie chodzi o zadne 300 mb...

0

ok z odczytem sobie poradzilem juz ale mam teraz problem z zapisem do pliku z pola JTextField... wie moze ktos jak to wykonac ? i jak automatycznie wyczyscic pole JTextField??

0

zapisuje sie analogicznie do wczytytwania...
JTextField - jak wyczyścic? dokumentacja od tego jest- nikt za Ciebie nie będzie przeglądał dokumentacji, rusz pupe i tyle

0

jak nie wiesz to nie pisz o dokumentacji...

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