Wie lassen sich die Selektion eines Textfeldes an- und abschalten und die Farbigkeit ändern?
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();
}
}