TextField.setText("") funktioniert nicht



  • 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