====== Praktische GUI Klassen======
===== AutoSuggest =====
import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
public class AutoSuggest extends JComboBox {
private final JComboBox comboBox = this;
private final JTextField textField = (JTextField) getEditor().getEditorComponent();
private final List suggestions = new LinkedList<>();
private boolean hide_flag = false;
public AutoSuggest() {
super();
setEditable(true);
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
EventQueue.invokeLater(() -> {
String text = textField.getText();
if (text.length() == 0) {
comboBox.hidePopup();
setModel(new DefaultComboBoxModel(suggestions.toArray()), "");
} else {
DefaultComboBoxModel m = getSuggestedModel(suggestions, text);
if (m.getSize() == 0 || hide_flag) {
comboBox.hidePopup();
hide_flag = false;
} else {
setModel(m, text);
comboBox.showPopup();
}
}
});
}
@Override
public void keyPressed(KeyEvent e) {
String text = textField.getText();
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_ENTER:
if (!suggestions.contains(text)) {
suggestions.add(text);
Collections.sort(suggestions);
setModel(getSuggestedModel(suggestions, text), text);
}
hide_flag = true;
break;
case KeyEvent.VK_ESCAPE:
hide_flag = true;
break;
case KeyEvent.VK_RIGHT:
for (int i = 0; i < suggestions.size(); i++) {
String str = suggestions.get(i);
if (str.startsWith(text)) {
comboBox.setSelectedIndex(-1);
textField.setText(str);
return;
}
}
break;
default:
break;
}
}
});
setModel(new DefaultComboBoxModel(suggestions.toArray()), "");
}
public void update(Set terms) {
textField.setText("");
suggestions.clear();
suggestions.addAll(terms);
setModel(new DefaultComboBoxModel(suggestions.toArray()), "");
}
private void setModel(DefaultComboBoxModel defaultComboBoxModel, String text) {
comboBox.setModel(defaultComboBoxModel);
comboBox.setSelectedIndex(-1);
textField.setText(text);
}
private static DefaultComboBoxModel getSuggestedModel(List list, String text) {
DefaultComboBoxModel m = new DefaultComboBoxModel();
list.stream().filter((s) -> (s.toLowerCase().startsWith(text.toLowerCase()))).forEach((s) -> {
m.addElement(s);
});
return m;
}
public JTextField getTextField() {
return textField;
}
public String getText() {
return textField.getText();
}
}
===== JHintTextField =====
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.JTextField;
public class JHintTextField extends JTextField {
private String hint = "";
public JHintTextField() {
}
public JHintTextField(String hint) {
setHint(hint);
}
public final void setHint(String hint) {
if (hint != null) {
this.hint = hint;
} else {
this.hint = "";
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
if (getText().length() == 0) {
int h = getHeight();
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Insets ins = getInsets();
FontMetrics fm = g.getFontMetrics();
int c0 = getBackground().getRGB();
int c1 = getForeground().getRGB();
int m = 0xfefefefe;
int c2 = ((c0 & m) >>> 1) + ((c1 & m) >>> 1);
g.setColor(new Color(c2, true));
g.drawString(hint, ins.left, h / 2 + fm.getAscent() / 2 - 1);
}
}
}
===== FocusHighlighter =====
import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.UIManager;
public class FocusHighlighter implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
e.getComponent().setBackground(Color.YELLOW);
}
@Override
public void focusLost(FocusEvent e) {
e.getComponent().setBackground(UIManager.getColor("TextField.background"));
}
}
===== DisposeWithESC =====
import java.awt.event.KeyEvent;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.KeyStroke;
public class DisposeWithESC {
private DisposeWithESC() {
}
public static void attach(JDialog jDialog) {
jDialog.getRootPane().registerKeyboardAction(e -> {
jDialog.dispose();
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
}
}
===== LimitDocumentFilter =====
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class LimitDocumentFilter extends DocumentFilter {
public final int limit;
public LimitDocumentFilter(int limit) {
if (limit <= 0) {
throw new IllegalArgumentException("Limit can not be <= 0!");
}
this.limit = limit;
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
int currentLength = fb.getDocument().getLength();
int overLimit = (currentLength + text.length()) - limit - length;
if (overLimit > 0) {
text = text.substring(0, text.length() - overLimit);
}
if (text.length() >= 0) {
super.replace(fb, offset, length, text, attrs);
}
}
}
===== TableSearchDocumentListener =====
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TableSearchDocumentListener implements DocumentListener {
private final JTextField searchTextField;
private final TableRowSorter tableRowSorter;
public TableSearchDocumentListener(JTextField searchTextField, TableRowSorter tableRowSorter) {
this.searchTextField = searchTextField;
this.tableRowSorter = tableRowSorter;
}
@Override
public void insertUpdate(DocumentEvent e) {
updateTableRowSorter();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateTableRowSorter();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateTableRowSorter();
}
private void updateTableRowSorter() {
String searchFieldText = searchTextField.getText();
if (searchFieldText != null) {
String[] keywords = searchFieldText.split(" ");
tableRowSorter.setRowFilter(new KeywordFilter(keywords));
}
}
public class KeywordFilter extends RowFilter {
private final String[] keywords;
// Constructor for filtering a single keyword
public KeywordFilter(String keyword) {
this.keywords = new String[1];
this.keywords[0] = keyword.toLowerCase();
}
// Constructor for filtering an array of keywords
// Only the rows that contain every keyword are displayed
public KeywordFilter(String[] keywords) {
this.keywords = keywords;
// convert all keywords to lower case
for (int i = 0; i < keywords.length; i++) {
keywords[i] = keywords[i].toLowerCase();
}
}
@Override
public boolean include(RowFilter.Entry entry) {
// Does the row contain all keywords? Assume true and set to false if
// one is missing
boolean containsAll = true;
for (int i = 0; containsAll == true && i < keywords.length; i++) {
// Is the keyword contained in one of the columns? Assume false and
// set to true if it is found
boolean containsThis = false;
for (int j = 0; containsThis == false && j < entry.getValueCount(); j++) {
if (entry.getStringValue(j).toLowerCase().contains(keywords[i])) {
containsThis = true;
}
}
if (!containsThis) {
containsAll = false;
}
}
return containsAll;
}
}
}
/* Vorlage
===== Vorlage =====
*/