/ / Eingeschränkte Auswahl in einer JTextField / JTextComponent? - Java, Swing, Text, Auswahl, einschränken

Eingeschränkte Auswahl in einer JTextField / JTextComponent? - Java, Swing, Text, Auswahl, Einschränkung

Stellen Sie sich ein JFormattedTextField (oder eine beliebige JTextComponent) vor, bei der ein Präfix und ein Suffix um den tatsächlichen "Text" des Felds angezeigt werden.

Zum Beispiel wäre das Double 3.5 der String (über die Formatierung) "3.50", um den sich das Präfix "$" und das Suffix "" für einen Anzeigetext von "$ 3.50" befinden.

Dies ist eindeutig einfach zu bewerkstelligen. Der Benutzer kann jedoch weiterhin Text innerhalb des Präfixes / Suffixes auswählen, so dass er möglicherweise einen Teil oder das gesamte Präfix / Suffix löschen kann. Ich würde es vorziehen, wenn der Benutzer so eingeschränkt wäre, dass das Präfix / Suffix überhaupt nicht ausgewählt werden kann (solange es noch Teil des Textfelds ist, also keine JLabels). Ich kann dies fast mit einem CaretListener (oder durch Überschreiben von setCaretPosition / moveCaretPosition) erreichen, wodurch verhindert wird, dass ein C-a das gesamte Feld auswählt und die Pfeiltasten zum Verschieben in das Präfix / Suffix verwendet werden. Durch Ziehen mit der Maus und durch Drücken der Umschalttaste kann die Auswahl jedoch weiterhin in diese eingeschränkten Bereiche verschoben werden.

Irgendwelche Ideen?

Antworten:

6 für die Antwort № 1

Sie können dafür einen Navigationsfilter verwenden.

Hier ist ein Beispiel für den Einstieg:

import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class NavigationFilterPrefixWithBackspace extends NavigationFilter
{
private int prefixLength;
private Action deletePrevious;

public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component)
{
this.prefixLength = prefixLength;
deletePrevious = component.getActionMap().get("delete-previous");
component.getActionMap().put("delete-previous", new BackspaceAction());
component.setCaretPosition(prefixLength);
}

public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
{
fb.setDot(Math.max(dot, prefixLength), bias);
}

public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
{
fb.moveDot(Math.max(dot, prefixLength), bias);
}

class BackspaceAction extends AbstractAction
{
public void actionPerformed(ActionEvent e)
{
JTextComponent component = (JTextComponent)e.getSource();

if (component.getCaretPosition() > prefixLength)
{
deletePrevious.actionPerformed( null );
}
}
}

public static void main(String args[]) throws Exception {

JTextField textField = new JTextField("Prefix_", 20);
textField.setNavigationFilter( new NavigationFilterPrefixWithBackspace(7, textField) );

JFrame frame = new JFrame("Navigation Filter Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(textField);
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}

Ich glaube, so funktioniert ein JFormattedTextField. Ich bin mir also nicht sicher, ob Sie dies mit einem formatierten Textfeld verwenden können, da es möglicherweise das Standardverhalten ersetzt.