Jak odwołać się do komponentu jTextField znając jego nazwę?

0

Cześć!

Mam na formatce 25 JTextFieldów. Potrzebuję zrobić coś ala parser, żeby to, co ktoś wprowadzi w pole mogło byc tylko liczbą double. Korzystam z metody KeyReleased listenera KeyListener. Oto co wymodziłem do tej pory.

        if(e.getSource() == m00)
        {
            try {
                d_m00 = Double.parseDouble(m00.getText());
                repaint();
            } catch(NumberFormatException ex) {
            m00.setText("0.000");    
            }
        }
        if(e.getSource() == m10)
        {
            try {
                d_m10 = Double.parseDouble(m10.getText());
                repaint();
            } catch(NumberFormatException ex) {
            m10.setText("0.000");    
            }
        }
        if(e.getSource() == m01)
        {
            try {
                d_m01 = Double.parseDouble(m01.getText());
                repaint();
            } catch(NumberFormatException ex) {
            m01.setText("0.000");    
            }
        }
        if(e.getSource() == m11)
        {
            try {
                d_m11 = Double.parseDouble(m11.getText());
                repaint();
            } catch(NumberFormatException ex) {
            m11.setText("0.000");    
            }
        }

Nie zamierzam powielać jednak tego samego kodu 25 razy... no chyba że nie będzie wyjścia. Dlatego zacząłem robić coś takiego.

		Object source = e.getSource();
		JTextField jtf = (JTextField)source;

		try {
			double temp = Double.parseDouble(jtf.getText());
		} catch(NumberFormatException ex) {
			//NIE WIEM CO TU WPISAĆ, ABY ODWOŁAĆ SIĘ DO KOMPONENTU ZNAJĄC JEGO NAZWĘ
			String nazwa = jtf.getName();
		}

Co zrobić z tą nazwą, aby uzyskać dostęp do JTextFielda? A może jest jakiś inny mało inwazyjny sposób?

Pzdr
Szymon

0

A nie lepiej te textfield przechować w kolekcji?, wtedy nie będzie problemu z nazwami.

0

Witam,

Stwórz klasę jak ta poniżej dostosuj ja do swoich potrzeb

class TextFieldListener implements KeyListener{

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		Object source = e.getSource();
        JTextField jtf = (JTextField)source;

        try {
                double temp = Double.parseDouble(jtf.getText());
        } catch(NumberFormatException ex) {
                jtf.setText("");
        }
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}

i dodaj ją do 25 JTextField - ów
tf.addKeyListener(new TextFieldListener())
tf1.addKeyListener(new TextFieldListener())
....
tf25.addKeyListener(new TextFieldListener())

lub zrób to w pętli jeżeli masz listę tych textFieldów

pozdrawiam

0

Przecież już masz w tej swojej pętli dostęp do swojego JTextfielda, który wygenerował zdarzenie. To nic innego jak referencja jtf. W miejscu gdzie nie wiesz co wpisać powinno być jtf.setText("0.000");.
Tu nawet nie ma co wyszukiwać bo masz to na patelni. Nie wiem po co Ci nazwa komponentu, albo zmiennej przechowującej referencję skoro jedyne co jest istotne, to sam obiekt. getName() zwraca to co wcześniej przypisałeś setName(), a nazwa zmiennej przechowującej referencję (m00, m01, itd.) nie jest potrzebna absolutnie do niczego.

A co do komponentów (JTextfield) - jeżeli masz więcej niż 2 komponenty tego samego typu oraz ma je obsługiwać ta sama procedura obsługi, to praktycznie zawsze wrzuca się je do tablicy albo kolekcji będącej polem obiektu. Tworzenie osobnych x zmiennych nie ma większego sensu. A mając tablicę możesz łatwo porównywać lub wyszukiwać, a nawet posortować komponenty wg swoich kryteriów i wyszukiwać w nich binarnie. Oczywiście wyszukiwanie może mieć sens tylko wtedy gdy komponenty będą reagować na siebie nawzajem.

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