Wie lassen sich die Selektion eines Textfeldes an- und abschalten und die Farbigkeit ändern?

Die Klasse JTextComponent definiert Methoden, mit denen die Text-Selektion der von ihr abgeleiteten Komponenten (JEditorPane, JTextArea, JTextField) beeinflusst werden kann.

Das Beispiel zeigt eine von JFrame abgeleitete Klasse, die die GUI stellt. Auf ihrer Oberfläche befinden sich zwei JButton und ein JTextField , das zur Demonstration der Selektionseigenschaften dient. Die Buttons schalten zum einen die Selektionsfähigkeit des Text im Textfeld an und ab und ändern zum anderen die hierbei verwendeten Farben zwischen den Standardfarben und selbst gewählten, im Quelltext hardcodierten.

Die gesamte Routine befindet sich wegen ihrer geringen Komplexität in der Methode initGUI() . Hier wird zunächst das JTextField initialisiert. In der Folge wird auf drei Instanzvariablen zugegriffen, die ein Objekt vom Typ Highlighter , sowie die Farbwerte für den Selektions-Hintergrund und die Selektions-Textfarbe speichern. Die drei Variablen müssen klassenweite Zugänglichkeit besitzen. Bei lokaler Deklaration müssten sie aufgrund des Zugriffs in einer anonymen Klasse final gesetzt werden. Dies jedoch ist nicht möglich, da sie als Speicher des jeweiligen Zustands der Textfeld-Eigenschaften dienen.

Nach der Deklaration der JButton wird jeder bei einer anonymen ActionListener -Klasse angemeldet. In deren actionPerformed() -Methoden werden die Zustände durch entsprechende Getter-Methoden abgefragt und je nach Zustand wie o.a. geändert. Gleichzeitig wird die Aufschrift des zugehörigen Buttons angepasst.

Der Rest des Quelltextes legt die Gestaltung des UI fest: Ein JPanel wird deklariert, auf dem die beiden Buttons gruppiert werden. Textfeld und Button-Panel werden in den letzten beiden Zeilen der Methode dem Frame hinzugefügt.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.Highlighter;

public class Textselektion extends JFrame {

    Highlighter hl = null;
    Color defaultSelTextColor, defaultSelColor;

    public Textselektion() {
        initGUI();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setTitle("Selection-Test");
        this.setVisible(true);
    }

    private void initGUI() {
        final JTextField field = new JTextField(20);
        hl = field.getHighlighter();
        defaultSelTextColor = field.getSelectedTextColor();
        defaultSelColor = field.getSelectionColor();
        final JButton highlightButt = new JButton("No Highlight");
        highlightButt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (field.getHighlighter() != null) {
                    field.setHighlighter(null);
                    highlightButt.setText("Highlight");
                } else {
                    field.setHighlighter(hl);
                    highlightButt.setText("No Highlight");
                }
            }
        });
        final JButton selectButt = new JButton("Default Selection");
        selectButt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (field.getSelectionColor() != defaultSelColor) {
                    field.setSelectionColor(defaultSelColor);
                    field.setSelectedTextColor(defaultSelTextColor);
                    selectButt.setText("Custom Colors");
                } else {
                    field.setSelectionColor(Color.GREEN);
                    field.setSelectedTextColor(Color.RED);
                    selectButt.setText("Default Colors");
                }
            }
        });
        JPanel buttPanel = new JPanel(new FlowLayout());
        buttPanel.add(selectButt);
        buttPanel.add(highlightButt);
        this.add(buttPanel, BorderLayout.SOUTH);
        this.add(field, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        new Textselektion();
    }
}