Event Handling TextFields und Suchfunktion

MrClave

Bekanntes Mitglied
Moin,

(Lese mich gerade erst in das Thema GUI ein)

Ich hab' da ein Problem mit meinem GUI und den JTextFields.
Ich habe 8 TextFields welche default nicht editierbar sein sollen (was ja kein Problem ist), allerdings sollen alle bei Knopfdruck "Insert User" editierbar werden und halt die Informationen in einer DB speichern, was an sich auch kein Thema ist.

Nur irgendwie funktioniert dies nicht über eine boolean Variable, welche ich bei Knopfdruck auf true setze. Wenn ich aber explizit alle TextFields manuell auf true setze, funktioniert dies.

Was überseh' ich ? Oder ist dies gar nicht realisierbar ?
Mag' für euch wahrscheinlich eine noob Frage sein, aber ich steh' voll auf'm Schlauch.

Das ist der Code, der explizit mit dem Button und TextField zusammenhängt.
Falls ihr den ganzen Code benötigt, werde ich es editieren ^^
Java:
private boolean editable = false;
	
	public boolean getEditable(){
		return this.editable;
	}
	
	public void setEditable( boolean editable ){
		this.editable = editable;
	}


         insertUser.setBounds(   25,  25, 200,  30 );
         insertUser.addActionListener( new ButtonHandler() );

         textCPRNo.setEditable(getEditable());
		textFirstname.setEditable(getEditable());
		textLastName.setEditable(getEditable());
		textLastName.setEditable(getEditable());
		textPhoneNo.setEditable(getEditable());
		textEmail.setEditable(getEditable());
		textAddress.setEditable(getEditable());
		textCity.setEditable(getEditable());
		textZipcode.setEditable(getEditable());


private class ButtonHandler implements ActionListener{
	
		@Override
		public void actionPerformed(ActionEvent e) {
			
			if ( e.getSource() == insertUser ){
				setEditable(true);
			//	textCPRNo.setEditable(true); (dies funktioniert)
			
				
			}
			
		}
		
	}


Und dann wäre da noch eine JList mit einem JTextField (in diesem Fall das Suchfeld)
Die JList soll die CPRNr aus meiner DB anzeigen + Username ( auch kein Thema ).
So, aber ich würde gerne, dass wenn ich etwas in das Suchfeld eingebe, dass zur Laufzeit, ohne irgendein Knopfdruck, die Suche aktualisiert wird.
So, wie die Windows oder Google SuFu z.B.

Ist dies viel zu viel Arbeit, oder lässt sich dies relativ gut umsätzen ?
Falls es zu viel wird, werde ich dies einfach per Knopfdruck machen, allerdings bin ich heiß drauf, mehr zu lernen :rtfm::toll:
 

Schandro

Top Contributor
Der Aufruf von
Code:
setEditable(true);
ändert NUR den Inhalt der Variable
Code:
editable
, sonst NICHTS. Java bemerkt nicht auf magische Weise das du weiter oben bereits einmal
Code:
textCPRNo.setEditable(getEditable());
usw. aufgerufen hattest und denkt sich "hey, editable hat sich verändert, jetzt will MrClave mit Sicherheit auch das sich die ganzen buttons verändern". Das ist nicht wie Programmiersprachen funktionieren. Das ändern der Variable
Code:
editable
alleine hat keinerlei Auswirkungen auf die Buttons.

Du musst den ganzen Code hier:
Java:
        textFirstname.setEditable(getEditable());
        textLastName.setEditable(getEditable());
        textLastName.setEditable(getEditable());
        textPhoneNo.setEditable(getEditable());
        textEmail.setEditable(getEditable());
        textAddress.setEditable(getEditable());
        textCity.setEditable(getEditable());
        textZipcode.setEditable(getEditable());
auch bei jedem actionPerformed-Event ausführen. Am besten packst du ihn einfach in die setEditable-Methode rein...

So, aber ich würde gerne, dass wenn ich etwas in das Suchfeld eingebe, dass zur Laufzeit, ohne irgendein Knopfdruck, die Suche aktualisiert wird.
Klar geht das, warum auch nicht. Häng einfach nen DocumentListener an das JTextField und mach die Datenbankabfrage bei jeder Änderung des Inhalts.
 

MrClave

Bekanntes Mitglied
Danke dir. Das mit den TextFields hat soweit funktioniert. Allerdings weiß ich nicht, wie das mit dem DocumentListener funktionieren soll.

Und mein Ansatz ist 100% sicher auch komplett falsch, aber bei Google finde ich nichts wirklich passendes dazu.

Ich poste euch einfach mal die bisherige GUI Klasse.
(Ja, es sind einige schlechte Styles verbaut)

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;


public class UserInterface {

	JFrame frame;
	
	DefaultListModel userList;
	JList searchList;
	JScrollPane scrollpane;
	
	JButton insertUser;
	JButton displayUser;
	JButton editUser;
	JButton deleteUser;
	JButton insertReading;
	
	JLabel userCPRNo;
	JLabel userFirstname;
	JLabel userLastName;
	JLabel userEmail;
	JLabel userPhoneNo;
	JLabel userAddress;
	JLabel city;
	JLabel zipcode;
	
	JTextField textCPRNo;
	JTextField textFirstname;
	JTextField textLastName;
	JTextField textEmail;
	JTextField textPhoneNo;
	JTextField textAddress;
	JTextField textCity;
	JTextField textZipcode;
	JTextField searchField;
	
	private boolean editable = false;
	
	public void setEditable( boolean editable ){
		this.editable = editable;
		textCPRNo.setEditable(this.editable);
		textFirstname.setEditable(this.editable);
		textLastName.setEditable(this.editable);
		textLastName.setEditable(this.editable);
		textPhoneNo.setEditable(this.editable);
		textEmail.setEditable(this.editable);
		textAddress.setEditable(this.editable);
		textCity.setEditable(this.editable);
		textZipcode.setEditable(this.editable);
	}
	
		
	public UserInterface(){
		
		frame = new JFrame();
		frame.setTitle( "Waterworks Project" );
		frame.setSize( 800, 500 );
		frame.setResizable( false );
		frame.setLocationRelativeTo( null );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setLayout( null ); 
		
		
		insertUser    = new JButton("Insert User");
		displayUser   = new JButton("Display User");
		editUser      = new JButton("Edit User");
		deleteUser    = new JButton("Delete User");
		insertReading = new JButton("Insert Reading");
		
		insertUser.setBounds(   25,  25, 200,  30 );
		displayUser.setBounds(  25,  65, 200,  30 );
		editUser.setBounds(     25, 105, 200,  30 );
		deleteUser.setBounds(   25, 145, 200,  30 );
		insertReading.setBounds(25, 185, 200,  30 );
				
		insertUser.addActionListener( new ButtonHandler() );
		displayUser.addActionListener( new ButtonHandler() );
		editUser.addActionListener( new ButtonHandler() );
		deleteUser.addActionListener( new ButtonHandler() );
		insertReading.addActionListener(new ButtonHandler() );
		
		
		textCPRNo     = new JTextField();
		textFirstname = new JTextField();
		textLastName  = new JTextField();
		textPhoneNo   = new JTextField();
		textEmail     = new JTextField();
		textAddress   = new JTextField();
		textCity      = new JTextField();
		textZipcode   = new JTextField();
		searchField   = new JTextField();
		
		
		textCPRNo.setEditable(false);
		textFirstname.setEditable(false);
		textLastName.setEditable(false);
		textLastName.setEditable(false);
		textPhoneNo.setEditable(false);
		textEmail.setEditable(false);
		textAddress.setEditable(false);
		textCity.setEditable(false);
		textZipcode.setEditable(false);
		
		
		userList = new DefaultListModel();
		searchList = new JList(userList);
		searchList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		searchField.getDocument().addDocumentListener(new SearchHandler() );	
			
		
		scrollpane = new JScrollPane(searchList);
		scrollpane.setPreferredSize( new Dimension( 200, 185 ) );
		scrollpane.setBounds( 25, 225, 200, 185 );
		
	
		textCPRNo.setBounds(     400,  25, 350, 30 );
		textFirstname.setBounds( 400,  65, 350, 30 );
		textLastName.setBounds(  400, 105, 350, 30 );
		textPhoneNo.setBounds(   400, 145, 350, 30 );
		textEmail.setBounds(     400, 185, 350, 30 );
		textAddress.setBounds(   400, 225, 350, 30 );
		textCity.setBounds(      400, 265, 350, 30 );
		textZipcode.setBounds(   400, 305, 350, 30 );
		searchField.setBounds(    25, 420, 200, 30 );
		
		
		userCPRNo     = new JLabel("CPR / CVR:", SwingConstants.RIGHT);
		userFirstname = new JLabel("Firstname:", SwingConstants.RIGHT);
		userLastName  = new JLabel("Lastname:",  SwingConstants.RIGHT);
		userPhoneNo   = new JLabel("Phone:",     SwingConstants.RIGHT);
		userEmail     = new JLabel("Email:",     SwingConstants.RIGHT);
		userAddress   = new JLabel("Address:",   SwingConstants.RIGHT);
		city          = new JLabel("City:",      SwingConstants.RIGHT);
		zipcode       = new JLabel("Zipcode:",   SwingConstants.RIGHT);
		

		userCPRNo.setBounds(     300,  25,  85,  30 );
		userFirstname.setBounds( 300,  65,  85,  30 );
		userLastName.setBounds(  300, 105,  85,  30 );
		userPhoneNo.setBounds(   300, 145,  85,  30 );
		userEmail.setBounds(     300, 185,  85,  30 );
		userAddress.setBounds(   300, 225,  85,  30 );
		city.setBounds(          300, 265,  85,  30 );
		zipcode.setBounds(       300, 305,  85,  30 );
		
	
		frame.add(insertUser);
		frame.add(displayUser);
		frame.add(editUser);
		frame.add(deleteUser);
		frame.add(insertReading);
		
		frame.add(textCPRNo);
		frame.add(textFirstname);
		frame.add(textLastName);
		frame.add(textPhoneNo);
		frame.add(textEmail);
		frame.add(textAddress);
		frame.add(textCity);
		frame.add(textZipcode);
		frame.add(searchField);
		
		frame.add(userCPRNo);
		frame.add(userFirstname);
		frame.add(userLastName);
		frame.add(userPhoneNo);
		frame.add(userEmail);
		frame.add(userAddress);
		frame.add(city);
		frame.add(zipcode);
		
		frame.add(scrollpane);
		
		frame.setVisible(true);
		
	}
	
	
	private class ButtonHandler implements ActionListener{
	
		@Override
		public void actionPerformed(ActionEvent e) {
			boolean editable;
			
			if ( e.getSource() == insertUser ){
				editable = true;
				setEditable(true);
				
			} else if ( e.getSource() == displayUser ){
				editable = false;
				setEditable(editable);
				
			} else if ( e.getSource() == editUser ){
				editable = true;
				setEditable(true);
				
			} else if ( e.getSource() == deleteUser ){
				editable = false;
				setEditable(editable);
				
			} else if ( e.getSource() == insertReading ){
				editable = true;
				setEditable(true);
				
			}
			
		}
		
	}
	
	private class SearchHandler implements DocumentListener{

		@Override
		public void changedUpdate(DocumentEvent de) {
			de.getDocument();
		}

		@Override
		public void insertUpdate(DocumentEvent de) {
			de.getDocument();
			String array[] = { "Hans", "Martin", "Kristian", "Peter", "Daniel", "Martin", "Marvin", "Joshua", "Dieter", "Bohlen", "Werner", "Olm", "Hans" };
			
			for ( int i = 0; i < array.length; i++ ){
				if ( de.getDocument().toString().startsWith(array[i])){
					userList.addElement(array[i]);
				}
			}
		}

		@Override
		public void removeUpdate(DocumentEvent de) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	
}
 

KrokoDiehl

Top Contributor
Prinzipiell würde ich mit dem DocumentListener wie folgt anfangen:

Java:
        JTextField fld = ...;
        fld.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void removeUpdate(DocumentEvent e) {
                Document doc = e.getDocument();
                sucheNachEintraegen( doc.getText(0, doc.getLength()) );
            }
            
            @Override
            public void insertUpdate(DocumentEvent e) {
                Document doc = e.getDocument();
                sucheNachEintraegen( doc.getText(0, doc.getLength()) );
            }
            
            @Override
            public void changedUpdate(DocumentEvent e) {
                Document doc = e.getDocument();
                sucheNachEintraegen( doc.getText(0, doc.getLength()) );
            }
        });

Jenachdem welches Verhalten du willst, muss es nicht bei allen update-Methoden sein. Das muss man ausprobieren.
Etwas kniffliger wird sicherlich, wenn du den Vorschlag aus der Suche als Text in das Textfeld setzt: Das
Code:
setText(...)
ruft sicherlich wieder deinen DocumentListener auf und dann könnte es fix zu einer Endlosschleife kommen. Aber das ist dann erstmal ein Folgeproblem ;-)
 

MrClave

Bekanntes Mitglied
Das ist mir dann doch etwas zu kompliziert. Ich habe keinen Plan, was ich genau machen soll, aber ist auch egal.
Ich werde das einfach per Buttonpress aktualisieren.

Eine andere Frage wäre allerdings noch, wie ich meinem
Code:
Confirm
Button erzählen kann, welcher Knopf vorher gedrückt wurde.

z.B. Soll
Code:
Confirm
einen Nutzer hinzufügen, wenn
Code:
Insert User
zuvor ausgewählt wurde und, falls
Code:
Edit User
zuvor gedrückt wurde, soll er den Nutzer einfach aktualiseren.
Sprich, Confirm soll 2-3 verschiedene Methoden steuern.

Wie erzähle ich
Code:
Confirm
, welcher Button zuvor gedrückt wurde ?


Mit get/setActionCommand() hat es nicht funktioniert und auch sonst hab' ich es nicht wirklich zum laufen bekommen.

Mein bisheriger Ansatz: (Beispiel)

Java:
if ( e.getActionCommand().equals("INSERT") ) 
{
       if ( e.getActionCommand().equals("CONFIRM") ) 
       {
              // IN DB EINFÜGEN
       }
}
 

KrokoDiehl

Top Contributor
Bei einem Buttonklick bzw. generell in einer Ereignisbehandlung kannst du nicht einfach so wissen, welche Button/Aktion irgendwann vorher gemacht wurde.

Dafür musst du intern einen Zustand verwalten, z.B. über boolsche Variable. Wenn der Benutzer dann auf "Neu" klickt, setzt du eine Variable clickedNew auf true und wenn er dann auf "Confirm" klickt, kannst du prüfen auf was clickedNew steht.
Es gibt sicher noch einige andere Möglichkeiten, aber das wäre ein direkter Weg.
 

MrClave

Bekanntes Mitglied
Bei einem Buttonklick bzw. generell in einer Ereignisbehandlung kannst du nicht einfach so wissen, welche Button/Aktion irgendwann vorher gemacht wurde.

Dafür musst du intern einen Zustand verwalten, z.B. über boolsche Variable. Wenn der Benutzer dann auf "Neu" klickt, setzt du eine Variable clickedNew auf true und wenn er dann auf "Confirm" klickt, kannst du prüfen auf was clickedNew steht.
Es gibt sicher noch einige andere Möglichkeiten, aber das wäre ein direkter Weg.

Ich hoffe, dass ich das richtig verstanden habe, aber irgendwie geht dies auch nicht.

In der privaten Klasse deklariere ich 2 boolsche Variablen und ändere diese dann bei dem jeweiligen Buttonpress.

Ich fürchte, dass ich grad' einfach nur dumm bin ???:L


Java:
private class ButtonHandler implements ActionListener{
	
		private boolean insertValidation;
		private boolean editValidation;
		
		public boolean isEditValid(){
			return this.editValidation;
		}
		
		public void setEditValidation( boolean validation ){
			this.editValidation = validation;
		}
		
		public boolean isInsertValid(){
			return this.insertValidation;
		}
		
		public void setInsertValidation( boolean validation ){
			this.insertValidation = validation;
		}
		
		
		Methods method = new Methods();
		
		@Override
		public void actionPerformed(ActionEvent e) {
			
			if ( e.getSource() == insertUser ){
				setTextFieldEditable(true);
				setButtonEnabled(true);
				setInsertValidation(true);
												
			}  
			
			if ( e.getSource() == displayUser ){
				setTextFieldEditable(false);
				setButtonEnabled(false);
					
			} 
			
			if ( e.getSource() == editUser ){
				setTextFieldEditable(true);
				setButtonEnabled(true);
				setEditValidation(true);
				
			}  
			
			if ( e.getSource() == deleteUser ){
				setTextFieldEditable(false);
				setButtonEnabled(false);
						
			}  
			
			if ( e.getSource() == insertReading ){
				setTextFieldEditable(true);
				setButtonEnabled(true);
				
			}  
			
			  else if ( e.getSource() == editUser && isEditValid()  ){
				
				method.changeUser(textCPRNo.getText().toString(), 
						      textFirstname.getText().toString(), 
						       textLastName.getText().toString(), 
								textAddress.getText().toString(), 
								textZipcode.getText().toString(), 
								textPhoneNo.getText().toString(), 
								  textEmail.getText().toString(), 
								   textCity.getText().toString() );
			}
	
			
			if ( e.getSource() == clear ){
				
				clearTextFields();
			}
			
		}
		
	}
	
}
 

pl4gu33

Top Contributor
hier mal ein schnelles Beispiel mit ActionCommand (würde die Strings wohl normal eher irgendwo deklarieren anstatt sie überall "einzutippen", das wäre dann sicherer, dass alle wirklich das Gleiche meinen aber zum Beispiel reicht es denk ich ;)) :

Dein "Fehler" ist, du kannst nicht einfach 2 Action Commands in einem Durchlauf abfragen, weil ja pro Event nur einer übertragen wird.

So ähnlich würde das dann auch mit booleans gehen, bloß hast du noch ein paar mehr Abfragen...

Java:
public class ButtonTest {	

	public ButtonTest(){
		JFrame frm = new JFrame();
		frm.setSize(400, 400);
		JPanel pnl = new JPanel();
		JButton create = new JButton("Create");
		JButton update = new JButton("Update");
		JButton start = new JButton("Start");
		
		MyActionListener actionListener = new MyActionListener();		
		
		create.setActionCommand("create");
		update.setActionCommand("update");
		start.setActionCommand("start");
		
		create.addActionListener(actionListener);
		update.addActionListener(actionListener);
		start.addActionListener(actionListener);

		
		frm.add(pnl);
		pnl.add(create);
		pnl.add(update);
		pnl.add(start);
		frm.setVisible(true);

	}
	public static void main(String[] args) {
		new ButtonTest();
	}	
}

class MyActionListener implements ActionListener{
	
	private String clickedText;
	
	@Override
	public void actionPerformed(ActionEvent e) {		
		if((e.getActionCommand().equals("create")) || (e.getActionCommand().equals("update"))){
			clickedText = e.getActionCommand();
			System.out.println("Setze :"+clickedText);
		}else if((e.getActionCommand().equals("start")) && (clickedText != null)){
			System.out.println("START");
			if(clickedText.equals("create")){
				System.out.println("CREATE");
			}else{
				System.out.println("UPDATE");
			}
		}else{
			System.out.println("Nichts gesetzt");
		}
	}
}
 
Zuletzt bearbeitet:

Schandro

Top Contributor
eine anonyme Instanz von ActionListener pro Button direkt am Button dran ist allerdings um ein vielfaches besser zu lesen als mit actioncommands zu arbeiten, deswegen würde ich auf jedenfall dazu raten.
 

pl4gu33

Top Contributor
eine anonyme Instanz von ActionListener pro Button direkt am Button dran ist allerdings um ein vielfaches besser zu lesen als mit actioncommands zu arbeiten, deswegen würde ich auf jedenfall dazu raten.

das stimmt wohl,... besonders, wenn die Buttons eh alle was anderes machen sollen. Das war jetzt nur das Beispiel, dass es auch mit ActionCommands geht und warum das oben bei dem Ersteller nicht geklappt hat :)
 
Zuletzt bearbeitet:

MrClave

Bekanntes Mitglied
eine anonyme Instanz von ActionListener pro Button direkt am Button dran ist allerdings um ein vielfaches besser zu lesen als mit actioncommands zu arbeiten, deswegen würde ich auf jedenfall dazu raten.


Yessir ! :)

Ich danke euch!

Mit den bool'schen Variablen und den anonymen Instanzen, hat es letzt Endlich geklappt.
( noch :lol: )

Aber jetzt hab' ich das Prinzip dahinter verstanden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
B JavaFX Textfields: Fortschritt als ProgressBar und Progressindicator AWT, Swing, JavaFX & SWT 5
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
M Swing Butten & TextFields aus Applet im JFrame nicht sichtbar AWT, Swing, JavaFX & SWT 2
F KontextMenü auf allen Textfields im Frame AWT, Swing, JavaFX & SWT 2
N Eingabe eines Textfields weiterverwenden AWT, Swing, JavaFX & SWT 6
I Textfields dynamisch erzeugen AWT, Swing, JavaFX & SWT 4
S Scrollbares Bild und Unsichtbare TextFields AWT, Swing, JavaFX & SWT 7
loadbrain auslesen der Werte dynamischer Textfields AWT, Swing, JavaFX & SWT 21
V Fehlerbehandlung bei leeren TextFields AWT, Swing, JavaFX & SWT 18
H TextFields anordnen AWT, Swing, JavaFX & SWT 8
G Unterschiedliche Textfields ansprechen AWT, Swing, JavaFX & SWT 4
B JTable mit Suchfunktion AWT, Swing, JavaFX & SWT 16
S JList Suchfunktion AWT, Swing, JavaFX & SWT 7
G Suchfunktion AWT, Swing, JavaFX & SWT 5
T Suchfunktion AWT, Swing, JavaFX & SWT 25
L jTextField mit automatische Suchfunktion? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben