TextField.setText("") funktioniert nicht



  • Guten Tag,

    Bei meiner GUI soll Bei der auswahl einer CheckBox ein bestimmtes Textfeld geleert und deaktiviert werden und beim Drücken des Buttons sollen alle Textfelder geleert werden.
    Das wollte ich mit TextField.setText("") erreichen, der eingegebene Text bleibt allerdings einfach im Feld stehen. Bei setText("test") wird der Text aber ohne Probleme ersetzt.. 😕

    Hier mal mein verkürzter Code, bei dem der Fehler (zumindest bei mir) auftritt:

    import java.awt.*;
    import java.awt.event.*;
    
    @SuppressWarnings("serial")
    public class Test extends Frame implements ActionListener, ItemListener {
    
    	private CheckboxGroup cbg;
    	private TextField text1;
    	private TextField text2;
    
    	public Test() {
    
    		super("Test");
    
    		text1 = new TextField(10);
    		text2 = new TextField(10);
    
    		Panel oben = new Panel();
    		oben.setLayout(new FlowLayout());
    		add(oben, BorderLayout.NORTH);
    
    		cbg = new CheckboxGroup();
    		Checkbox eins = new Checkbox("eins", cbg, true);
    		eins.addItemListener(this);
    		Checkbox zwei = new Checkbox("zwei", cbg, false);
    		zwei.addItemListener(this);
    		oben.add(eins);
    		oben.add(zwei);
    
    		oben.add(text1);
    		oben.add(text2);
    
    		Button action = new Button("action");
    		action.addActionListener(this);
    
    		add(action, BorderLayout.SOUTH);
    
    		this.addWindowListener(new WindowAdapter() {
    			public void windowClosing(WindowEvent e) {
    				dispose();
    			}
    		});
    
    		pack();
    		setVisible(true);
    
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		text1.setText("test");
    		text2.setText("");
    	}
    
    	@Override
    	public void itemStateChanged(ItemEvent e) {
    		if (cbg.getSelectedCheckbox().getLabel().equals("zwei")) {
    			text2.setText("");
    			text2.setEnabled(false);
    		} else{
    			text2.setEnabled(true);
    		}
    	}
    
    	public static void main(String[] args) {
    		new Test();
    	}
    
    }
    

    Ich stehe hier vor einem Rätsel, vorallem weil das Problem beim vollständigen Code zuerst bei allen Textfeldern auftrat und jetzt plötzlich nur noch bei dem, das deaktiviert wird...Ich kann mich aber nicht daran erinnern irgendwas am Code geändert zu haben 😕
    Woran kann das liegen? (Ich verwende Eclipse, sollte aber eigentlich keine Rolle spielen, oder?)

    Danke für die Antworten!

    EDIT:
    Es scheint zu funktionieren, wenn vorher in der selben Methode getText() aufgerufen wurde...Ist das ein Bug ? In der API steht jedenfalls nichts darüber


  • Mod

    Ich habe lange nichts GUI-artiges mehr gemacht, aber ich koennte mir vorstellen, dass Du dem Programm noch irgendwo sagen musst, dass da etwas upgedated werden soll. Such mal nach entsprechenden Methoden mit verdaechtig klingendem Namen in der API.



  • Ich hab da jetzt nichts derartiges gefunden, außerdem kann ich den Text im Feld ja mit jedem beliebigen String außer eben mit dem leeren String "" ersetzen und es wird korrekt angezeigt...



  • Ersetz den Text doch durch ein Leerzeichen.



  • Ersetz den Text doch durch ein Leerzeichen.



  • Saehe zwar optisch korrekt aus, wäre aber extrem benutzerunfreundlich...Wenn die Eingabe in dem Feld zum Beispiel entweder leer oder eine Zahl sein muss, bekommt der Benutzer eine Fehlermeldung ohne das Feld überhaupt angerührt zu haben. Außerdem hätte er eben ein ungewolltes Leerzeichen vor seiner Eingabe.



  • Hmm... da du AWT nutzt, könnte das auch betriebssystemspezifisch sein. Ich konnte das Verhalten bei mir allerdings nachvollziehen und das Problem mit

    text2.setText("\0");
    

    beheben. Funktioniert das bei dir eventuell auch?



  • Das Problem betrifft bei mir zumindest sowohl unter Ubuntu (14.04) als auch unter Windows 7 auf..

    Mit "\0" funktioniert es zwar, aber bei der Weiterverarbeitung stört es leider trotzdem..das hier funktioniert dann z.B. nicht:

    @Override
    	public void actionPerformed(ActionEvent e) {
    		doSomething();
    		text1.setText("test");
    		text2.setText("\0");
    	}
    
    	public void doSomething() {
    		try {
    			if (!text2.getText().isEmpty()) {
    				int i = Integer.parseInt(text2.getText());
    				System.out.println(i);
    			}
    
    		} catch (NumberFormatException e) {
    			System.out.println(e.getMessage());
    		}
    	}
    

    Hat der Nullterminator in Java eigentlich irgendeine Funktion (wie beispielsweise in C)?



  • Wie sieht es mit setText(null) aus?



  • KJoke schrieb:

    Mit "\0" funktioniert es zwar, aber bei der Weiterverarbeitung stört es leider trotzdem..das hier funktioniert dann z.B. nicht: [...]

    "Funktioniert nicht" ist keine Problembeschreibung. Was funktioniert nicht? Wie sieht der Fehler aus? Und was sollte stattdessen passieren?



  • setText(null) funktioniert auch nicht, tut aber auch glaube ich das gleiche wie setText("")

    Das Textfeld sieht so aus als wäre es leer, wegen dem \0 hat der Inhalt aber nichtmehr die Länge 0 und deswegen liefert isEmpty() dann false und natürlich wirft parseInt(string) dann eine NumberFormatException . Auch wenn man zuerst das Feld mit \0 löscht und dann eine Zahl einträgt gibt's eine NumberFormatExcception



  • Das mit dem Null-Byte im STring ist tatsächlich nicht optimal. Ich habe dein Beispiel mal auf Swing umgestellt. Da funktioniert dann auch (zumindest bei mir) das Setzen mit der leeren Zeichenkette. Wäre das eine Option für dich:

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener, ItemListener {
    
        private JTextField text1;
        private JTextField text2;
    
        private ButtonGroup buttons;
    
        public Test() {
    
            super("Test");
    
            buttons = new ButtonGroup();
    
            JPanel oben = new JPanel();
            oben.setLayout(new FlowLayout());
            add(oben, BorderLayout.NORTH);
    
            JRadioButton eins = new JRadioButton("eins", true);
            eins.addItemListener(this);
            buttons.add(eins);
            oben.add(eins);
    
            JRadioButton zwei = new JRadioButton("zwei", false);
            zwei.addItemListener(this);
            buttons.add(zwei);
            oben.add(zwei);
    
            text1 = new JTextField(10);
            text2 = new JTextField(10);
    
            oben.add(text1);
            oben.add(text2);
    
            JButton action = new JButton("action");
            action.addActionListener(this);
    
            add(action, BorderLayout.SOUTH);
    
            this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    dispose();
                }
            });
    
            pack();
            setVisible(true);
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            doSomething();
            text1.setText("test");
            text2.setText("");
        }
    
        public void doSomething() {
            try {
                if (!text2.getText().isEmpty()) {
                    int i = Integer.parseInt(text2.getText());
                    System.out.println(i);
                }
    
            } catch (NumberFormatException e) {
                System.out.println(e.getMessage());
            }
        }
    
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (((JRadioButton) e.getSource()).getText().equals("zwei")) {
                text2.setText("");
                text2.setEnabled(false);
            } else{
                text2.setEnabled(true);
            }
        }
    
        public static void main(String[] args) {
            new Test();
        }
    
    }
    


  • Funktioniert auf jeden Fall, auch wenn mir Swing optisch nicht wirklich zusagt 😉
    Ist aber auch nicht übermäßig wichtig, ist mir nur bei der Bearbeitung meiner Übungsaugaben im letzten Semester aufgefallen, das Semester ist aber ja auch schon zuende.

    Generell scheint mit awt aber nicht alles ganz rund zu laufen, mir sind da noch ein paar andere seltsame 'Bugs' aufgefallen.

    Jedenfalls vielen Dank für die Antworten 🙂



  • Vielleicht ist etwas falsch installiert und deswegen funktioniert's nicht?



  • Es funktionierte weder auf meinem Desktop PC mit Windows 7 noch auf meinem Laptop mit Ubuntu noch bei meinem Tutor noch bei einem Kommilitonen mit dem ich das Übungsblatt zusammen bearbeitet habe und bei Dasd tritt das Problem auch auf also wohl eher nicht 😉


Anmelden zum Antworten