Swing JTextField durch einen JButton leeren

  • Themenstarter Themenstarter ash34
  • Beginndatum Beginndatum
A

ash34

Gast
Hallo,

ich würde ganz gerne den Inhalt eines JTextFields leeren, sobald ich auf einen bestimmten Button drücke. Ich habe dazu folgendes implementiert:

Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;

public class ResetListener implements ActionListener {
	
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		
		Component[] c = new Component[Frame.inputFields().getComponentCount()];
		c = Frame.inputFields().getComponents();
		
		for(int i=0; i<c.length; i++){
			if(i%2 != 0 && i<50){
				Component comp = c[i];
				JTextField lab = (JTextField)comp;
				System.out.println(lab.getText());
				lab.setText("");
			}
		}
	}
}

Zur Erklärung:

Frame ist eine Klasse die ein JFrame erstellt. inputFields() ist eine statische Methode, die einen Container zurückgibt, in dem an bestimmten Stellen die Textfelder sind.

Das Auslesen der Felder über

Java:
System.out.println(lab.getText())
klappt wunderbar..nur das beschreiben bzw leeren eben nicht... ???:L
 
Also zu deiner Aufgabe:
Java:
public void actionPerformed(ActionEvent arg0)
{
   if(arg0.getSource().equals(buttonx))
   {
      lab.setText("");
   }
}
Keine Ahnung warum du das so kompliziert machst, vielleicht willst du auch noch etwas anders aber wenn du mit deiner Methode nur löschen willst denn ist sie zu kompliziert.
 
Zuletzt bearbeitet:
Das funktioniert leider auch nicht:

Java:
for(int i=0; i<c.length; i++){
			if(i%2 != 0 && i<50 && arg0.getSource().equals(Frame.append)){
				
				Component comp = c[i];
				JTextField lab = (JTextField)comp;
				System.out.println(lab.getText());
				lab.setText("");
			}
 
Also, die Methode inputFields() der Klasse Frame erstellt einen Haufen JLabels und JTextFields. Die werden dann alle in einen Container gepackt, den die Methode inputFields() zurück gibt.
An diesen Container will ich im ActionListener mit

Java:
	Component[] c = new Component[Frame.inputFields().getComponentCount()];
		c = Frame.inputFields().getComponents();

Dieses Array beeinhaltet jetzt alle Komponenten des Containers (oder ???:L).
Also laufe ich jetzt mit einer for - Schleife durch dieses Array

Java:
for(int i=0; i<c.length; i++){
			if(i%2 != 0 && i<50){
				
				Component comp = c[i];
				JTextField lab = (JTextField)comp;
				System.out.println(lab.getText());
				lab.setText("");
			}

Zur Erläuterung der if - Klausel: Die JTextFields liegen immer an ungeraden Indexen bis Position 49.

Wenn ich also ein solches JTextField habe (noch ist es ja ein Component), dann caste ich es und setze den Text neu..soweit der Plan...
 
Du machst dir mit deinen static Funktionen nur selber das Leben schwer. Außerdem kennt sich da auch kein anderer mehr damit aus. Wenn du eine Komponente nach außen hin verfügbar machen willst, schreib einen getter.
 
Ich denke er will es bei allen löschen allerdings sind die Felder nur in dem Array und nur an jeder 2ten Stelle...
Also ganz ehrlich da solltest du deinen Code nochmal überdenken.
 
@bERt0r:

ok, das ganze static Zeug habe ich beseitigt..ist ja auch relativ simpel

Ich will den Inhalt aller Felder löschen.
Das Problem ist, dass ich 25 JLabels und 25 JTextFields erzeugen muss..deshalb verwende ich einen Container und versuche dann auf die einzelnen Elemente zuzugreifen..
 
Java:
public interface ResetableComponent {
	
	public void reset();

}

Java:
public class ResetableJTextFeld extends JTextField implements ResetableComponent{

	private static final long serialVersionUID = 1L;

	@Override
	public void reset() {
		this.setText("");
	}

}

Java:
public class ResetActionListener implements ActionListener {

	private ArrayList<ResetableComponent> liste;
	
	public ResetActionListener(ArrayList<ResetableComponent> liste){
		this.liste = liste;
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		for(int i=0; i<liste.size();i++){
			liste.get(i).reset();
		}
	}

}

Java:
public class TestUmgebeung {
	
	private JPanel pnlContent;
	private ArrayList<ResetableComponent> listTFields;
	
	public TestUmgebeung(){
		
		pnlContent = new JPanel();
			pnlContent.setLayout(new BoxLayout(pnlContent, BoxLayout.Y_AXIS));
		listTFields = new ArrayList<ResetableComponent>();
		
		for(int i=0;i<5;i++){
			ResetableJTextFeld tf = new ResetableJTextFeld();
			tf.setText("Blubb Nr." + (i+1));
			listTFields.add(tf);
			pnlContent.add(tf);
		}
		pnlContent.add(Box.createGlue());
		JButton btn = new JButton("Klick mich");
			btn.addActionListener(new ResetActionListener(listTFields));
		pnlContent.add(btn);
	}
	
	public JPanel getContentPanel(){
		return pnlContent;
	}

	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new TestUmgebeung().getContentPanel());
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
	}
	
}

Sollte tun, was du möchtest.

Gruß Vanny
 
@Vanny ... ist das nicht nen bisschen überzogen? 😀 Dann kann er doch auch direkt ne ArrayList<JTextField> nehmen und die im ActionListener durch iterieren und überall "setText("");" machen 😀
 
Zuletzt bearbeitet:
@Vanny ... ist das nicht nen bisschen überzogen? ...
Naja nun will er noch den Text in seinen Buttons ändern, einige Labels mit einbauen und Resetten etc. .
Dann hat er schonmal ne gute Ausgangsbasis und ausserdem hatte ich Lust drauf 😀

Es ist halt ein Unterschied ob ich auf einem JTextField#setText(""); aufrufe oder auf einer ResetableComponent#reset(); 😉
Gruß vanny
 
Zuletzt bearbeitet von einem Moderator:
@vanny

Erstmal Danke für die Antwort. Ich will aber nicht den Text auf meinen Buttons ändern, sondern mit einer Art "Reset - Button" einfach nur alle Felder leeren.

Ich hab in meinem Code nochmal ein bisschen aufgeräumt:

Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;

public class ResetListener implements ActionListener {
	
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		
		Frame frame = new Frame();
		Component[] c = new Component[frame.getTextFields().getComponentCount()];
		
		for(int i=0; i<c.length; i++){
			c[i] = frame.getTextFields().getComponent(i);
		}
		
		for(int i=0; i<c.length; i++){
			
			JTextField field = (JTextField)c[i];
			System.out.println(field.getText());
			field.setText("");
		}
	}
}

Java:
public class Frame{
	
	final Dimension puzzleDim = new Dimension(800,800);
	final Dimension dataDim = new Dimension(500,800);
	final JFrame puzzleFrame = new JFrame();
	final JFrame dataFrame = new JFrame();
	
	final Box box = new Box(100, 30, 0, 0);
	
	public static void main(String[] args){
	
		Frame frame = new Frame();
		frame.paintFrame();
	}
	
	
	/**
	 * method for creating all Labels and TextFields for data input
	 * @return List which contains all Containers
	 */
	
	private ArrayList<Container> inputFields(){
		
		ArrayList<Container> containerList = new ArrayList<Container>();
		
		Container labelContainer = new Container();
		labelContainer.setLayout(new GridLayout(25, 1));
		
		Container textContainer = new Container();
		textContainer.setLayout(new GridLayout(25, 1));
		
		Container buttonContainer = new Container();
		buttonContainer.setLayout(new FlowLayout());
		
		JLabel praeambel = new JLabel("Präambel: ");
		labelContainer.add(praeambel);
		JTextField praeField = new JTextField("a");
		praeField.setEditable(true);
		textContainer.add(praeField);
		
		JLabel tarAddrEth = new JLabel("Target Address(Eth): ");
		labelContainer.add(tarAddrEth);
		JTextField tarAddrEtField = new JTextField("b");
		tarAddrEtField.setEditable(true);
		textContainer.add(tarAddrEtField);
		
		JLabel sourceAddrEth = new JLabel("Source Address(Eth): ");
		labelContainer.add(sourceAddrEth);
		JTextField sourceAddrEthField = new JTextField();
		sourceAddrEthField.setEditable(true);
		textContainer.add(sourceAddrEthField);

		JLabel length = new JLabel("Length/Type: ");
		labelContainer.add(length);
		JTextField lengthField = new JTextField();
		lengthField.setEditable(true);
		textContainer.add(lengthField);

		JLabel vers = new JLabel("Vers: ");
		labelContainer.add(vers);
		JTextField versField= new JTextField();
		versField.setEditable(true);
		textContainer.add(versField);

		JLabel hdrLen = new JLabel("HdrLen: ");
		labelContainer.add(hdrLen);
		JTextField hdrLenField = new JTextField();
		hdrLenField.setEditable(true);
		textContainer.add(hdrLenField);

		JLabel tos = new JLabel("TOS: ");
		labelContainer.add(tos);
		JTextField tosField = new JTextField();
		tosField.setEditable(true);
		textContainer.add(tosField);

		JLabel ipPackLength = new JLabel("IP - Packet Length: ");
		labelContainer.add(ipPackLength);
		JTextField ipPackLengthField = new JTextField();
		ipPackLengthField.setEditable(true);
		textContainer.add(ipPackLengthField);
		
		JLabel packID = new JLabel("Packet ID: ");
		labelContainer.add(packID);
		JTextField packIDField = new JTextField();
		packIDField.setEditable(true);
		textContainer.add(packIDField);
		
		JLabel fragOff = new JLabel("Fragment Offset: ");
		labelContainer.add(fragOff);
		JTextField fragOffField = new JTextField();
		fragOffField.setEditable(true);
		textContainer.add(fragOffField);
		
		JLabel ttl = new JLabel("TTL: ");
		labelContainer.add(ttl);
		JTextField ttlField = new JTextField();
		ttlField.setEditable(true);
		textContainer.add(ttlField);
		
		JLabel prot = new JLabel("Protocol: ");
		labelContainer.add(prot);
		JTextField protField = new JTextField();
		protField.setEditable(true);
		textContainer.add(protField);
		
		JLabel hCheckSum = new JLabel("Header Checksum: ");
		labelContainer.add(hCheckSum);
		JTextField hCheckSumField = new JTextField();
		hCheckSumField.setEditable(true);
		textContainer.add(hCheckSumField);
		
		JLabel tarAddrIP = new JLabel("Target Address(IP): ");
		labelContainer.add(tarAddrIP);
		JTextField tarAddrIPField = new JTextField();
		tarAddrIPField.setEditable(true);
		textContainer.add(tarAddrIPField);
		
		JLabel sourceAddrIP = new JLabel("Source Address(IP): ");
		labelContainer.add(sourceAddrIP);
		JTextField sourceAddrIPField = new JTextField();
		sourceAddrIPField.setEditable(true);
		textContainer.add(sourceAddrIPField);
		
		JLabel options = new JLabel("Options: ");
		labelContainer.add(options);
		JTextField optionsField = new JTextField();
		optionsField.setEditable(true);
		textContainer.add(optionsField);
		
		JLabel padding = new JLabel("Padding: ");
		labelContainer.add(padding);
		JTextField paddingField = new JTextField();
		paddingField.setEditable(true);
		textContainer.add(paddingField);
		
		JLabel type = new JLabel("Type: ");
		labelContainer.add(type);
		JTextField typeField = new JTextField();
		typeField.setEditable(true);
		textContainer.add(typeField);
		
		JLabel code = new JLabel("Code: ");
		labelContainer.add(code);
		JTextField codeField = new JTextField();
		codeField.setEditable(true);
		textContainer.add(codeField);
		
		JLabel checkSum = new JLabel("Checksum: ");
		labelContainer.add(checkSum);
		JTextField checkSumField = new JTextField();
		checkSumField.setEditable(true);
		textContainer.add(checkSumField);
		
		JLabel identifier = new JLabel("Identifier: ");
		labelContainer.add(identifier);
		JTextField identifierField = new JTextField();
		identifierField.setEditable(true);
		textContainer.add(identifierField);
		
		JLabel seqNum = new JLabel("Sequence Number: ");
		labelContainer.add(seqNum);
		JTextField seqNumField = new JTextField();
		seqNumField.setEditable(true);
		textContainer.add(seqNumField);
		
		JLabel data = new JLabel("Data: ");
		labelContainer.add(data);
		JTextField dataField = new JTextField();
		dataField.setEditable(true);
		textContainer.add(dataField);
		
		JLabel pad = new JLabel("Pad: ");
		labelContainer.add(pad);
		JTextField padField = new JTextField();
		padField.setEditable(true);
		textContainer.add(padField);
		
		JLabel pSum = new JLabel("Prüfsumme: ");
		labelContainer.add(pSum);
		JTextField pSumField = new JTextField();
		pSumField.setEditable(true);
		textContainer.add(pSumField);
		
		JButton append = new JButton("APPEND");
		JButton	reset = new JButton("RESET");
		
		append.addActionListener(new AppendListener());
		reset.addActionListener(new ResetListener());
		
		buttonContainer.add(append);
		buttonContainer.add(reset);		
		
		containerList.add(labelContainer);
		containerList.add(textContainer);
		containerList.add(buttonContainer);
		
		return containerList;
	}
	
	public Container getTextFields(){
		return inputFields().get(1);
	}
	
	/**
	 * method for painting the frames
	 */
	
	private void paintFrame(){
		
		BorderLayout border = new BorderLayout();
		BoxPanel boxp = new BoxPanel();
		boxp.addBox(box);
		
		puzzleFrame.setTitle("Echo Request Puzzle");
		puzzleFrame.setSize(puzzleDim);
		puzzleFrame.setLocation(new Point(0,0));
		puzzleFrame.add(boxp);
		puzzleFrame.setVisible(true);
		puzzleFrame.setDefaultCloseOperation(puzzleFrame.EXIT_ON_CLOSE);
	
		dataFrame.setTitle("Echo Request Input");
		dataFrame.setLayout(border);
		dataFrame.setSize(dataDim);
		dataFrame.setLocation(new Point(puzzleFrame.getSize().width + 10, 0));
		dataFrame.add(inputFields().get(0), border.WEST);
		dataFrame.add(inputFields().get(1), border.CENTER);
		dataFrame.add(inputFields().get(2), border.SOUTH);
		dataFrame.setVisible(true);
		dataFrame.setDefaultCloseOperation(dataFrame.EXIT_ON_CLOSE);
		
	}
}

Ich verstehe aber immer noch nicht, warum ich erfolgreich aus den JTextFields lesen, aber nicht in sie schreiben kann...
Die Syso Zeile in ResetListener gibt mir nämlich tadellos den Inhalt der Felder aus... :bahnhof:
 
Schau dir mal mein Beispiel an und wenn du es dann plump lösen willst (also nur die TextFelder), dann wandle es pl4gu33 - Vorschlag entsprechend um.
Ich kann deinem Code leider keine vielversprechende Logik abgewinnen.

Sry und Gruß Vanny

[EDIT]
Ich will aber nicht den Text auf meinen Buttons ändern, sondern mit einer Art "Reset - Button" einfach nur alle Felder leeren.

Genau das tut mein Beispiel von oben:autsch: Es könnte halt noch mehr aber zur Zeit tut es genau das, was du willst.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Fehler gefunden 🙂

War recht simpel...anstatt auf den vorhandenen Container zuzugreifen, habe ich immer einen neuen erstellt.

Danke an alle 😉
 

Zurück
Oben