Frage

Ich habe ohne Glück versucht, ein JFormattedTextfield zu bekommen, um den Mausklick hervorzuheben. Ich habe es in der Lage war, es gut zu funktionieren, während ich durch Felder tastet, aber ich möchte alles beim Klicken hervorheben.

Ich bin nur in der Lage, auf Mausklick hervorzuheben, wenn ich im Textfeld ca. 1,5-2 Sekunden lang klicke. Ich habe keine Idee warum.

Ich habe einige Korrekturen gesucht und ausprobiert, einschließlich der Erweiterung der Klasse.

class HFTextField extends JFormattedTextField
{
    HFTextField(MaskFormatter formatter)
    {
        super(formatter);
    }

    @Override
    protected void processFocusEvent(FocusEvent e)
    {
        super.processFocusEvent(e);
        if (e.getID() == FocusEvent.FOCUS_GAINED)
        {
            this.selectAll();
        }
    }
}

Ich definiere auch einen (eher ausführlichen!) Fokussierer, der Swingutilities verwendet.invokelater;

public static FocusListener CreateHighlightTextFieldFocusListener(final JTextField text_field)
    {
        FocusListener fl =
                new FocusAdapter()
                {
                    public void focusGained(FocusEvent evt)
                    {
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                text_field.selectAll();
                            }
                        });
                    }
                };

        return fl;
    }

Und dies ist die Funktion, die formatierte Textfelder erstellt;

public static JTextField CreateFormattedTextField(int x, int y, int width, int height,
                            Method action_method, Method changed_method, Method remove_method,
                            Method update_method, String mask_formatter, String banned_chars)
    {
        MaskFormatter formatter = null;

        try {

            formatter = new MaskFormatter(mask_formatter);

        } catch (ParseException e) {
            assert(false);
        }

        if(banned_chars != null)
            formatter.setInvalidCharacters(banned_chars);

        JTextField text_field = new HFTextField(formatter);

        text_field.setBounds(x, y, width, height);

        if(action_method != null)
        {
            text_field.addActionListener(CreateTextFieldActionListener(action_method, text_field));
        }

        text_field.getDocument().addDocumentListener(
                CreateTextFieldDocumentListener(changed_method, remove_method,
                                                update_method, text_field));

        text_field.addFocusListener(CreateHighlightTextFieldFocusListener(text_field));

        return text_field;

Jede Hilfe wäre sehr geschätzt!

War es hilfreich?

Lösung

Vielleicht haben Sie Probleme mit EDT,

Wie Methode Sie verwenden, um JTextField einen Mehrwert zuzugeben

Arbeitet mit JTextfield, jformatedDTextfield, auch mit JCombobox und mit automatisch abgeschlossenen Funktionen http://www.java2s.com/code/java/swing-jfc/autocompleteTextfield.htm

   private FocusListener focsListener = new FocusListener() {

    @Override
    public void focusGained(FocusEvent e) {
        dumpInfo(e);
    }

    @Override
    public void focusLost(FocusEvent e) {
        //dumpInfo(e);
    }

    private void dumpInfo(FocusEvent e) {
        //System.out.println("Source  : " + name(e.getComponent()));
        //System.out.println("Opposite : " + name(e.getOppositeComponent()));
        //System.out.println("Temporary: " + e.isTemporary());
        Component c = e.getComponent();
        if (c instanceof JFormattedTextField) {
            ((JFormattedTextField) c).requestFocus();
            ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText());
            ((JFormattedTextField) c).selectAll();
        } else if (c instanceof JTextField) {
            ((JTextField) c).requestFocus();
            ((JTextField) c).setText(((JTextField) c).getText());
            ((JTextField) c).selectAll();
        }
    }

    private String name(Component c) {
        return (c == null) ? null : c.getName();
    }
};

Andere Tipps

Probieren Sie den folgenden Code aus

 yourTextField.addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusGained(java.awt.event.FocusEvent evt) {
                    SwingUtilities.invokeLater( new Runnable() {
                                    @Override
                                    public void run() {
                                            yourTextField.selectAll();              
                                    }
                            });
                }
            });

Ich hasse es, eine einfache Antwort zu geben, aber haben Sie versucht, die Mouselistener -Schnittstelle (oder die Mouseadapter -Klasse) zu verwenden?

Haben Sie so etwas ausprobiert:

fieldName.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            JTextComponent text = (JTextComponent) e.getSource();
            text.selectAll();
        }      
    });

Außerdem würde ich dies nicht asynchron empfehlen.

Wenn Sie ein spezielles Verhalten für einen Mausklick wünschen, fügen Sie Ihrem jTextfiled einen Mouseadapter hinzu und ändern Sie im Mouseclicked -Ereignis -Handler explizit den Hintergrund.

Grundsätzlich können Sie diesen Code verwenden (nicht sicher, dass für jede Formaterin und Eingabemasken), jedoch für die Anzahl, Datum und String, die Sie anschließend verwenden können, um sicherzustellen

    myTextField.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {
            myTextField.requestFocus();
            myTextField.setText(myTextField.getText());
            myTextField.selectAll();
        }

        @Override
        public void focusLost(FocusEvent e) {
        }
    });

Sicher können Sie das in das Invokelate packen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top