Poprawne ustawienie keyPressed i ENTER

0

Witam!
Problem mój polega na tym, ze nie wiem jak ustawić keyPressed, aby poprawnie działał tzn. chce aby po wpisaniu danych przez uzytkownika do pola JTextField po wciśnięciu ENTERA pobrał on dane, zapisał pod zmienną i wyświetlił odpowiedni komunikat o kolejne dane (to póki co mi działa), a następnie po wpisaniu kolejnych danych znow zrobił to samo (to juz mi nie działa). JTextField nie reaguje na wciśnięcie po raz drugi ENTERA lub jezeli reaguje to podstawia wpisaną daną pod tą z pierwszego pola. Próbowałem bawić się z pętlą for, z if'ami, z deklaracja nowego keyPressed jednak nic mi to nie dało. Nie potrafię tego skonfigurowac. Prosiłbym o pomoc!

P.S. Jak uruchomicie program to trzeba wybrać opcję "Wpisz współczynniki ręcznie" gdyz to właśnie nad nią pracuję. Reszta funkcji, póki co niedostępna.
P.S.2 Problem znajduje się w klasie Program w funkcji public void actionPerformed(ActionEvent e) w pierwszym if'ie gdzie uzywam funkcji keyPressed.

Pasek_Opcji - klasa tworząca pasek z przyciskami

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Pasek_Opcji  extends JPanel{

    JLabel opcje1=new JLabel("OPCJE DANYCH");
    JLabel opcje2=new JLabel("METODY OBLICZANIA");
    JLabel opcje3=new JLabel("INNE OPCJE");
	JButton recznie=new JButton("Wpisz współczynniki ręcznie");
	JButton wczytaj=new JButton("Wczytaj współczynniki z pliku");
	JButton zapisz=new JButton("Zapisz rozwiązanie do pliku");
	JButton gauss=new JButton("Metoda eliminacji Gauss'a");
	JButton crout=new JButton("Metoda Crout'a");
	JButton cholesky=new JButton("Metoda Cholesky'ego");
	JButton wyczysc=new JButton("Wyczyść dane");
	JButton wyjscie=new JButton("Wyjście");
	JButton empty=new JButton("");
	
	/*	potrzebne elementy interfejsu	*/
	
	public Pasek_Opcji() {
						
		this.setLayout(new GridLayout(4,3));  //dodanie zarządcy rozkładu do tego pola gdzie rysuje przyciski
					
		/*utworzenie przyciku i dodanie go do okienka	*/
		this.add(opcje1);
		this.add(opcje2);
		this.add(opcje3);
		this.add(recznie);
		this.add(gauss);
		this.add(wyczysc);
		this.add(wczytaj);
		this.add(crout);
		this.add(empty);
		this.add(zapisz);
		this.add(cholesky);
		this.add(wyjscie);
		/*utworzenie pól tekstowych do wprowadzania tekstu i dodanie go do okienka	*/
	}
}

Okno_Dzialan - klasa wyświetlająca komunikaty w programie oraz obsługująca czytnik

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.Dimension;

import java.awt.*;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Okno_Dzialan extends JPanel {

    public JTextField czytnik;
    private final JEditorPane komunikaty = new JEditorPane();
    private MyDocumentFilter documentFilter;

    public Okno_Dzialan() {
        super();
        setLayout(new BorderLayout());
        tekst("\nWITAJ W PROGRAMIE!\n");
        createPanels();
    }

    public void createPanels() {
        czytnik = new JTextField();
        ((AbstractDocument)czytnik.getDocument()).setDocumentFilter(
            new MyDocumentFilter2()); 
        komunikaty.setEditable(false);
        czytnik.setEditable(false);
        komunikaty.setBackground(Color.lightGray);
        czytnik.setBackground(Color.lightGray);
        this.add(komunikaty, BorderLayout.NORTH);
        this.add(czytnik, BorderLayout.CENTER);
    }

    public void tekst(String a) {
        komunikaty.setText(a);
    }

    public void odblokowanie(){
        czytnik.setEditable(true);
        czytnik.setBackground(Color.white);
    }

    public int wczytaj_n(){
        int b = Integer.parseInt(czytnik.getText());
        return b;
    }

    public double[] wczytaj_x(){
        String calosc = czytnik.getText();
        String[] tab1 = calosc.split(" ");
        double[] tablica_liczb = new double[tab1.length];
        for (int i=0; i<tab1.length; i++){
            try{
                tablica_liczb[i] = Double.parseDouble(tab1[i]);
            }catch (NumberFormatException nfe){}
        }
        return tablica_liczb;
    }

    public void zamiana_pola(){
        ((AbstractDocument)czytnik.getDocument()).setDocumentFilter(
            new MyDocumentFilter());
    }

}

class MyDocumentFilter extends DocumentFilter
{   
    @Override
    public void insertString(FilterBypass fb, int offset,
    String string, AttributeSet attr)
    throws BadLocationException {
        try {
            if (string.equals(".") || string.equals(" ") || string.equals("-")){
                super.insertString(fb, offset, string, attr);
                return;
            }
            Double.parseDouble(string);
            super.insertString(fb, offset, string, attr);
        } catch (Exception e) {
            Toolkit.getDefaultToolkit().beep();
        }

    }

    @Override
    public void replace(FilterBypass fb, int offset, int length,
    String text, AttributeSet attrs)
    throws BadLocationException {
        try {
            if (text.equals(".") || text.equals(" ") || text.equals("-")) {
                super.insertString(fb, offset, text, attrs);
                return;
            }
            Double.parseDouble(text);
            super.replace(fb, offset, length, text, attrs);
        } catch (Exception e) {
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

class MyDocumentFilter2 extends DocumentFilter
{   
    @Override
    public void insertString(DocumentFilter.FilterBypass fp
    , int offset, String string, AttributeSet aset)
    throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.insertString(fp, offset, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fp, int offset
    , int length, String string, AttributeSet aset)
    throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.replace(fp, offset, length, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }
}

Program - główna klasa programu

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Program extends JFrame implements ActionListener {
    BorderLayout rozklad = new BorderLayout(1,1); 
    JFileChooser wybor_pliku = new JFileChooser("C:\\"); 
    Pasek_Opcji pasek=new Pasek_Opcji();
    Okno_Dzialan okno = new Okno_Dzialan();
    boolean czy = false;
    int n;
    //int strona = 2;
    double[][] tablica_x;
    public Program(){
        this.setLayout(rozklad);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(800, 480);
        this.setTitle("Rozwiązywanie Układów Równań Liniowych"); 
        this.add(okno, BorderLayout.CENTER);
        this.add(pasek, BorderLayout.SOUTH);
        pasek.recznie.addActionListener(this);
        pasek.gauss.addActionListener(this);
        pasek.wyczysc.addActionListener(this);
        pasek.wczytaj.addActionListener(this);
        pasek.crout.addActionListener(this);
        pasek.zapisz.addActionListener(this);
        pasek.cholesky.addActionListener(this);
        pasek.wyjscie.addActionListener(this);
        this.setVisible(true); 
    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == pasek.recznie) {
            okno.odblokowanie();
            okno.tekst("\nPODAJ ILOŚĆ RÓWNAŃ (n):\n");
            for(int a=0; a<3; a++){
                if(a==0){
                    okno.czytnik.addKeyListener
                    (new KeyAdapter() {
                            public void keyPressed(KeyEvent e) {
                                int key = e.getKeyCode();
                                if (key == KeyEvent.VK_ENTER) {
                                    try{
                                        n = okno.wczytaj_n();
                                        okno.tekst("\nPODAJ WSPÓŁCZYNNIKI DLA "+n+" RÓWNAŃ\n(współczynniki oddziel kolejno spacją):\n");
                                        okno.zamiana_pola();
                                    }catch (NumberFormatException nfe) {}
                                }
                            }
                        });

                }else  if(a==1){
                    okno.czytnik.addKeyListener
                    (new KeyAdapter() {
                            public void keyPressed(KeyEvent e) {
                                int key = e.getKeyCode();
                                if (key == KeyEvent.VK_ENTER) {
                                    try{
                                        int k = 0;
                                        double[] tablica_liczb;
                                        tablica_liczb = okno.wczytaj_x();
                                        for(int i=0; i<n; i++){
                                            for(int j=0; j<n; j++){
                                                tablica_x[i][j] = tablica_liczb[k];
                                                k++;
                                            }
                                        }
                                        okno.tekst("\nPODAJ WYNIKI DLA "+n+" RÓWNAŃ\n(wyniki oddziel kolejno spacją):\n");
                                        okno.zamiana_pola();

                                    }catch (NullPointerException npe){}	
                                }

                            }
                        });
                }
            }

        }
        else if (e.getSource() == pasek.wczytaj) {
        }
        else if (e.getSource() == pasek.zapisz) {
        }
        else if (e.getSource() == pasek.gauss) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
            }
        }
        else if (e.getSource() == pasek.crout) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
            }
        }
        else if (e.getSource() == pasek.cholesky) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
            }
        }
        else if (e.getSource() == pasek.wyczysc) {
            okno.tekst("\nWITAJ W PROGRAMIE!\n");
            okno.createPanels();
            n=0;
        }
        else if (e.getSource() == pasek.wyjscie) {
        }   
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Program();
                }
            }); // tak się powinno uruchamiać aplikacje okienkowe
    }

}

dodanie znaczników <code class="java"> - furious programming

0

Jak chcesz by JTextField reagował na ENTER, to wystarczy mu podpiąć ActionListenera. KeyListener jest zbyteczny.
Kod jest bardzo nieczytelny, program nie jest userfriendly. Ignorujesz błędy (pusta sekcja catch). Do pola okno.czytnik dodajesz dwa KeyListenery, zadziałaja obydwa, w kolejności "losowej".

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