Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen

Curry

Aktives Mitglied
Hallo!

Ich möchte ein kleines Programm schreiben mit dem man die Anzahl der Tage zwischen zwei Daten berechnen kann. In diese Programm gibt es drei JTextFields.

inputDate1, inputDate2 und inputDays

Ich würde das gerne so machen, dann wenn in einem der drei Felder ein Wert verändert wird, dadurch das nicht-dominante andere Feld automatisch verändert. Soll heißen:

Änderung in inputeDate1 berechnet anhand inputDays das Feld inputDate2 neu.
Änderung in inputeDate2 berechnet anhand inputDate2 das Feld input Days neu.
Und so weiter...

Die Funktion, die diese Berechnung durchführt hatte ich gedacht in die Klasse MainFrame zu stecken und calculateDate zu nennen.

Die Frage ist nur: Wie kann ich diese Methode aktivieren, wenn in einem der drei Textfelder eine Änderung vorgenommen wurde?

Aus MyDocumentListener kann man nicht "form.calculateDate()" aufrufen.

Java:
public class MainFrame extends JFrame implements ActionListener {

    private JFormattedTextField inputDate1;
    private JTextField inputDays;
    private JTextField inputDate2;

    public MainFrame() {
        super("TageRechner");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel content = new JPanel();

        setContentPane(content);

        initComponents();

        pack();

        setLocationRelativeTo(null);
    }

    private void initComponents() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        Dimension d = new Dimension(100, 25);

        JLabel label;

        label = new JLabel("Datum 1:");
        gbc.gridx = 0;
        gbc.gridy = 0;
        add(label, gbc);
        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN);
        inputDate1 = new JFormattedTextField(df);
        inputDate1.setPreferredSize(d);
        MyKeyListener myListener = new MyKeyListener();
        inputDate1.addKeyListener(myListener);
        MyDocumentListener myDocListener = new MyDocumentListener(this);
        inputDate1.getDocument().addDocumentListener(myDocListener);
        gbc.gridx = 1;
        gbc.gridy = 0;
        add(inputDate1, gbc);

        label = new JLabel("Tage:");
        gbc.gridx = 0;
        gbc.gridy = 1;
        add(label, gbc);
        inputDays = new JTextField();
        inputDays.setPreferredSize(d);
        gbc.gridx = 1;
        gbc.gridy = 1;
        add(inputDays, gbc);

        label = new JLabel("Datum 2:");
        gbc.gridx = 0;
        gbc.gridy = 2;
        add(label, gbc);
        inputDate2 = new JTextField();
        inputDate2.setPreferredSize(d);
        gbc.gridx = 1;
        gbc.gridy = 2;
        add(inputDate2, gbc);
    }
    
    public void calculateDate() {
        System.out.println("Test");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }

    class MyKeyListener implements KeyListener {

        int nBefore = 0;
        int nAfter = 0;

        @Override
        public void keyTyped(KeyEvent e) {
            /*
             * keyTyped wird aufgerufen bevor das Document aktualisiert wurde und kann
             * die vorherige Anzahl von Zeichen auslesen
             */
            JTextComponent tc = (JTextComponent) e.getComponent();
            nBefore = tc.getText().length();
        }

        @Override
        public void keyPressed(KeyEvent e) {
            /*
             * keyPressed wird aufgerufen bevor das Document aktualisiert wurde und kann
             * die vorherige Anzahl von Zeichen auslesen
             */
        }

        @Override
        public void keyReleased(KeyEvent e) {
            /*
             * keyReleased wird aufgerufen nachdem das Document aktualisiert wurde und kann
             * die aktuelle Anzahl von Zeichen auslesen
             */
            JTextComponent tc = (JTextComponent) e.getComponent();

            if (e.getKeyCode() == KeyEvent.VK_H) {
                String datum = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN).format(System.currentTimeMillis());
                tc.setText(datum);
            }

            // automatisches Setzen und Entfernen der Punkte
            nAfter = tc.getText().length();
            if ((nBefore == 1 && nAfter == 2) || (nBefore == 4 && nAfter == 5)) {
                tc.setText(tc.getText() + ".");
            }
            if (nBefore == 2 && nAfter == 2) {
                try {
                    tc.setText(tc.getText(0, 1));
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
            if (nBefore == 5 && nAfter == 5) {
                try {
                    tc.setText(tc.getText(0, 4));
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

    class MyDocumentListener implements DocumentListener {

        JFrame form;
        
        public MyDocumentListener(JFrame form) {
            this.form = form;
        }
        
        @Override
        public void insertUpdate(DocumentEvent e) {
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    }
}
 
Hi,
du kannst einfach dem JTextField eine actionPerformed zuordnen
Code:
jTextField1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jNumberField1_ActionPerformed(evt);
      }
});

Wenn du dann einen Text eingibst und dann Enter drückst, wird die Methode aufrufen, die du in der actionPerformed Methode aufrufst

@actionPerformed:
Code:
public void jNumberField1_ActionPerformed(ActionEvent evt) {
    //Methodenaufruf
    System.out.println("Ja");
}

Kleines Manko:
Wenn du statt Enter zu drücken ein anderes Feld aufrufst, dann wird die actionPerfomed nicht aufgerufen

Gruß eMmiE
 
Danke für die Antwort. Die ENTER-Taste sollte nicht gedrückt werden müssen. Die Sache mit actionPerformed hatte ich mir auch schon überleg, ist aber eher unglücklich und würde ich nur als Notlösung machen.
 
Java:
final JFormattedTextField tfDate1 = new JFormattedTextField();
final JFormattedTextField tfDate2 = new JFormattedTextField();
final JTextField tfDays = new JTextField();

Document doc = tfDate1.getDocument();
PlainDocument plainDoc;
if (doc instanceof PlainDocument){
   plainDoc = (PlainDocument)doc;
   plainDoc.setDocumentFilter(new DocumentFilter(){
     public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
           throws BadLocationException {
          Document doc = fb.getDocument();
          String oldInputString = doc.getLength()>0 ? doc.getText(0,doc.getLength()) : "";
          String newInputString = oldInputString.substring(0, offs) + str +
                (doc.getLength() > offs + length ? oldInputString.substring(offs+length) : "");
               // ...
               // tfDate1 und tfDate2 sind valid ?  --> calculateDate()
              super.replace(fb, offs, length, str, a);
        }
   });
}

Document doc2 = tfDate2.getDocument();
//...

Document doc3 = tfDays.getDocument();
//...
 
Zuletzt bearbeitet:
Hmmm ... die Methode "replace()" wird nicht aufgerufen oder habe ich das falsch verstanden oder falsch umgsetzt? Also das erste "System.out.println("test");" nach "if (doc1 instanceof PlainDocument) {" wird angezeigt, aber die anderen Ausgabe erscheinen nicht. Weder wenn ich in das Textfeld was eingabe, noch wenn ich was ändere.

Java:
public class MainFrame extends JFrame {

    private JFormattedTextField inputDate1;
    private JTextField inputDays;
    private JTextField inputDate2;

    public MainFrame() {
        super("TageRechner");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel content = new JPanel();

        setContentPane(content);

        initComponents();

        pack();

        setLocationRelativeTo(null);
    }

    private void initComponents() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        Dimension d = new Dimension(100, 25);

        JLabel label;

        label = new JLabel("Datum 1:");
        gbc.gridx = 0;
        gbc.gridy = 0;
        add(label, gbc);
        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN);
        inputDate1 = new JFormattedTextField(df);
        inputDate1.setPreferredSize(d);
        MyKeyListener myListener = new MyKeyListener();
        inputDate1.addKeyListener(myListener);
        MyDocumentListener myDocListener = new MyDocumentListener(this);
        inputDate1.getDocument().addDocumentListener(myDocListener);
        gbc.gridx = 1;
        gbc.gridy = 0;
        add(inputDate1, gbc);

        label = new JLabel("Tage:");
        gbc.gridx = 0;
        gbc.gridy = 1;
        add(label, gbc);
        inputDays = new JTextField();
        inputDays.setPreferredSize(d);
        gbc.gridx = 1;
        gbc.gridy = 1;
        add(inputDays, gbc);

        label = new JLabel("Datum 2:");
        gbc.gridx = 0;
        gbc.gridy = 2;
        add(label, gbc);
        inputDate2 = new JTextField();
        inputDate2.setPreferredSize(d);
        gbc.gridx = 1;
        gbc.gridy = 2;
        add(inputDate2, gbc);


        final Document doc1 = inputDate1.getDocument();
        PlainDocument plainDoc;
        if (doc1 instanceof PlainDocument) {
            System.out.println("test");
            plainDoc = (PlainDocument) doc1;
            plainDoc.setDocumentFilter(new DocumentFilter() {

                @Override
                public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
                    String oldInputString = doc1.getLength() > 0 ? doc1.getText(0, doc1.getLength()) : "";
                    String newInputString = oldInputString.substring(0, offs) + str
                            + (doc1.getLength() > offs + length ? oldInputString.substring(offs + length) : "");
                    // ...
                    // tfDate1 und tfDate2 sind valid ?  --> calculateDate()
                    calculateDate();
                    System.out.println("newInputString = " + newInputString);
                    super.replace(fb, offs, length, str, a);
                }
            });
        }

//        Document doc2 = tfDate2.getDocument();
//        //...
//
//        Document doc3 = tfDays.getDocument();
//        //...
    }

    public void calculateDate() {
        System.out.println("calculateDate-Test");
    }

    class MyKeyListener implements KeyListener {

        int nBefore = 0;
        int nAfter = 0;

        @Override
        public void keyTyped(KeyEvent e) {
            /*
             * keyTyped wird aufgerufen bevor das Document aktualisiert wurde und kann
             * die vorherige Anzahl von Zeichen auslesen
             */
            JTextComponent tc = (JTextComponent) e.getComponent();
            nBefore = tc.getText().length();
        }

        @Override
        public void keyPressed(KeyEvent e) {
            /*
             * keyPressed wird aufgerufen bevor das Document aktualisiert wurde und kann
             * die vorherige Anzahl von Zeichen auslesen
             */
        }

        @Override
        public void keyReleased(KeyEvent e) {
            /*
             * keyReleased wird aufgerufen nachdem das Document aktualisiert wurde und kann
             * die aktuelle Anzahl von Zeichen auslesen
             */
            JTextComponent tc = (JTextComponent) e.getComponent();

            if (e.getKeyCode() == KeyEvent.VK_H) {
                String datum = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN).format(System.currentTimeMillis());
                tc.setText(datum);
            }

            // automatisches Setzen und Entfernen der Punkte
            nAfter = tc.getText().length();
            if ((nBefore == 1 && nAfter == 2) || (nBefore == 4 && nAfter == 5)) {
                tc.setText(tc.getText() + ".");
            }
            if (nBefore == 2 && nAfter == 2) {
                try {
                    tc.setText(tc.getText(0, 1));
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
            if (nBefore == 5 && nAfter == 5) {
                try {
                    tc.setText(tc.getText(0, 4));
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

    class MyDocumentListener implements DocumentListener {

        JFrame form;

        public MyDocumentListener(JFrame form) {
            this.form = form;
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    }
}
 
Zuletzt bearbeitet:
Java:
import java.awt.FlowLayout;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;

public class Test extends JFrame{

        private JTextField tfDate1;
        private JTextField tfDate2;
        private JTextField tfDays;

    public Test(){
        setLayout(new FlowLayout());

        tfDate1 = new JTextField();
        tfDate2 = new JTextField();
        tfDays = new JTextField();

        tfDate1.setColumns(8);
        tfDate2.setColumns(8);
        tfDays.setColumns(4);
        tfDays.setEditable(false);

        add(tfDate1);
        add(tfDate2);
        add(tfDays);

        Document doc1 = tfDate1.getDocument();
        PlainDocument plainDoc1;
        if (doc1 instanceof PlainDocument){
            plainDoc1 = (PlainDocument)doc1;
            plainDoc1.setDocumentFilter(new MyDocFilter("1"));
        }

        Document doc2 = tfDate2.getDocument();
        PlainDocument plainDoc2;
        if (doc2 instanceof PlainDocument){
            plainDoc2 = (PlainDocument)doc2;
            plainDoc2.setDocumentFilter(new MyDocFilter("2"));
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
        pack();
        setVisible(true);

    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                 new Test();
            }
        });
    }

    class MyDocFilter extends DocumentFilter{

        private String type;
        private DateFormat df;
        private final int dayMilisec = 1000*60*60*24;

        public MyDocFilter(String type){
            if ( type != null && ( type.equals("1") || type.equals("2") ))
                this.type = type;
            else {
                throw new IllegalArgumentException();
            }
            df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN);
            df.setLenient(false);
        }

        @Override
        public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
           throws BadLocationException {
            Document doc = fb.getDocument();
            if (str.equalsIgnoreCase("h")){
                str = df.format(new Date());
                calculate(str);
                super.replace(fb, 0, doc.getLength(), str, a);
            } else {
                String oldInputString = doc.getLength()>0 ? doc.getText(0,doc.getLength()) : "";
                String newInputString = oldInputString.substring(0, offs) + str +
                  (doc.getLength() > offs + length ? oldInputString.substring(offs+length) : "");
                calculate(newInputString);
                super.replace(fb, offs, length, str, a);
            }
        }

        @Override
        public void remove(FilterBypass fb, int offs, int length) throws BadLocationException {
            Document doc = fb.getDocument();
            String oldInputString = doc.getLength()>0 ? doc.getText(0,doc.getLength()) : "";
            String newInputString = oldInputString.substring(0, offs) +
                (doc.getLength() > offs + length ? oldInputString.substring(offs+length) : "");
            calculate(newInputString);
            super.remove(fb, offs, length);
        }

        private void calculate(String inputStr){
            try {
                Date d1 = df.parse((type.equals("1")?inputStr:tfDate1.getText()));
                Date d2 = df.parse((type.equals("1")?tfDate2.getText():inputStr));
                long days = ( d2.getTime() - d1.getTime() ) / dayMilisec;
                tfDays.setText(Long.toString(days));
            } catch (ParseException e){
                tfDays.setText("???");
            }
        }
    }
}
 

Zurück
Oben