JtextField KeyPressed KeyAddapter przekazywanie zmiennych

0

Witajcie,
Z konieczności służbowej od niedawne eksperymentuje z programowaniem w Javie. Może będziecie w stanie pomóc mi w rozwiązaniu następującego problemu.
OPIS zagadnienia:
Piszę aplikację opartą na SWINGU która pozwoli porównać etykiety wysyłkowe z produkcyjnymi, przy czym niekoniecznie na jedną etykietę wysyłkową przypada jedna etykiety produkcyjna.
Użytkownik po wybraniu numeru wysyłki przystępuje do skanowania (tu skanowanie należy rozumieć jako wpisanie z klawiatury i zatwierdzenie enterem lub zeskanowanie czytnikiem kodów kreskowych). Ciąg danych jest skanowany do momentu napotkania znaku końca linii, po czym powinien zostać umieszczony w tablicy. Kolejność skanowania jest następująca:
skanuje pole nr etykiety
skanuje pole nr produktu
skanuje pole ilość produktu
po każdym zeskanowaniu powinna odbyć się walidacja wprowadzonych danych i jeśli są poprawne powinno nastąpić przejście do kroku następnego, w innym przypadku powtórzenie kroku.
W jednym czasie na ekranie powinno być widoczne jedno pole tekstowe do którego wprowadzane są dane.
Dla mniejszego zaciemnienia moja grafika:
user image
URL:http://www.fotosik.pl/pokaz_obrazek/b84e217fcfc08183.html

[glowa] P R O B L E M [glowa]
Udało mi się stworzyć kod który po wprowadzeniu ciągu wypisuje ten ciąg na ekranie tak samo mogę zrobić wpisywanie danych do tablicy, ale nie potrafię go wyrzucić po za klasę anonimową (tak to się chyba nazywa) - tzn żebym operacje na tablicy z danymi mógł wykonywać poza tym obszarem.

package job;

import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Task2 {

	public final static void main(String[] args) {
		JFrame frame = new JFrame("Wpisz i enter!");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2, 1));
		final JLabel label = new JLabel("Wpisz tekst i naciśnij enter");
		final JTextField textField = new JTextField("");

		textField.addKeyListener(new KeyAdapter() {
			String d = "";

			public void keyPressed(KeyEvent key) {
				String d = null;
				if (new Character('\n').equals(key.getKeyChar())) {
					d = textField.getText();
					label.setText(d);
					textField.setText("");
				}

			}
		});
		panel.add(label);
		panel.add(textField);
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}

Powyżej zamiast tablicy zmienna d, pytanko jak mogę ją wypisać println na samym końcu aplikacji?
Próbowałem wielu sposobów włącznie z przerobienie kodu na osobną klasę ale się jeszcze gubię [rotfl] [???] i nie wiem jak wywołać keyPressed -tzn co podać za KeyEvent key?:

package job;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MojaKlasa extends KeyAdapter {

	public static String keyPressed(KeyEvent key, JLabel label,
			JTextField textField) {

		String hd = null;
		if (new Character('\n').equals(key.getKeyChar())) {

			hd = hd + textField.getText();
			hd = hd.toString();
			label.setText(hd);
			textField.setText("");
		}
		return hd;
	}
}

Bawiłem się tym ponad 2 dni przeszperałem sporo, ale nie znalazłem rozwiązania. Będę wdzięczny za pomoc. [browar]

0

public class MojaKlasa extends KeyAdapter {

	private JLabel label;
	private JTextField textField;

	public MojaKlasa(JLabel label, JTextField textField) {
		this.label = label;
		this.textField = textField;
	}

	public void keyPressed(KeyEvent key) {

		String hd = null;
		if (new Character('\n').equals(key.getKeyChar())) {

			hd = hd + textField.getText();
			hd = hd.toString();
			label.setText(hd);
			textField.setText("");
		}
	}
}

I teraz

textField.addKeyListener(new MojaKlasa(label, textField));
0

Dziękuję bardzo za błyskawiczną pomoc :-) , prosiłbym jeszcze o wskazówkę jak mogę zwrócić zmienną hd, bo przy zmianie z void na String nie działa:

package job;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MojaKlasa extends KeyAdapter  {

        private JLabel label;
        private JTextField textField;

        public MojaKlasa(JLabel label, JTextField textField) {
                this.label = label;
                this.textField = textField;
        }

        public String keyPressed(KeyEvent key) {

                String hd = null;
                if (new Character('\n').equals(key.getKeyChar())) {

                        hd = textField.getText();
                        label.setText(hd);
                        textField.setText("");
                        hd=hd.toString();
                        
                }
                return hd;     
        }
}

chodzi mi o to żebym sobie później zmienił zwykłego Stringa na tablicę i wrzucał tam dane, a na końcu te dane obrobił(porównał do czegoś, zapisał itp.).

0

Oczywiście, że nie będzie działał, ponieważ obsługa zdarzenia odbywa się w metodzie zwracającej void "z automatu". Jeżeli chcesz przechowywać ostatnią wartość pola tekstowego to najłatwiej zrobić to tak:


public class MojaKlasa extends KeyAdapter {

        private JLabel label;
        private JTextField textField;
        private hd;

        public MojaKlasa(JLabel label, JTextField textField) {
                this.label = label;
                this.textField = textField;
        }

        public void keyPressed(KeyEvent key) {

                String hd = null;
                if (new Character('\n').equals(key.getKeyChar())) {

                        hd = hd + textField.getText();
                        hd = hd.toString();
                        label.setText(hd);
                        textField.setText("");
                }
        }

        public String getHd(){return hd;}
}
// i dalej

String hd = mojaKlasa.getHd();

Inaczej nie można. Nie możesz zmienić metody keyPressed().

0

Czy kod na pewno działa poprawnie? W metodzie keyPressed pole hd jest ukrywane przez zmienną hd w tej metodzie, dodatkowo "null" dołączany jest do ciągu.

public class MojaKlasa extends KeyAdapter {

        private JLabel label;
        private JTextField textField;
        private String hd;

        public MojaKlasa(JLabel label, JTextField textField) {
                this.label = label;
                this.textField = textField;
        }

        public void keyPressed(KeyEvent key) {
                String hd = "";
                if (new Character('\n').equals(key.getKeyChar())) {
                        hd += textField.getText();
                        this.hd = hd;
                        label.setText(hd);
                        textField.setText("");
                }
        }

        public String getHd(){return hd;}
}
// i dalej

String hd = mojaKlasa.getHd();

0

@iooi, literówka rzeczywiście.

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