Wie lassen sich die Selektion eines Textfeldes an- und abschalten und die Farbigkeit ändern?
Auf der Oberfläche eines JFrame
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.SwingUtilities;
import javax.swing.text.Highlighter;
public class Textselektion {
Highlighter hl = null;
Color defaultSelTextColor, defaultSelColor;
public Textselektion() {
initGUI();
}
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);
JFrame frame = new JFrame("Selection-Test");
frame.add(buttPanel, BorderLayout.SOUTH);
frame.add(field, BorderLayout.CENTER);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Textselektion());
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.