JFormattedTextField kann nicht zum Mausklick -Fokus -Ereignis hervorgehoben werden
-
26-10-2019 - |
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!
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 ...