2 package be
.nikiroo
.fanfix_swing
.gui
;
4 import java
.awt
.BorderLayout
;
5 import java
.awt
.event
.ActionEvent
;
6 import java
.awt
.event
.ActionListener
;
7 import java
.awt
.event
.KeyAdapter
;
8 import java
.awt
.event
.KeyEvent
;
10 import javax
.swing
.JButton
;
11 import javax
.swing
.JPanel
;
12 import javax
.swing
.JTextField
;
13 import javax
.swing
.SwingUtilities
;
15 import be
.nikiroo
.fanfix_swing
.gui
.utils
.UiHelper
;
16 import be
.nikiroo
.fanfix_swing
.images
.IconGenerator
;
17 import be
.nikiroo
.fanfix_swing
.images
.IconGenerator
.Icon
;
18 import be
.nikiroo
.fanfix_swing
.images
.IconGenerator
.Size
;
21 * A generic search/filter bar.
25 public class SearchBar
extends JPanel
{
26 static private final long serialVersionUID
= 1L;
28 private JButton search
;
29 private JTextField text
;
30 private JButton clear
;
32 private boolean realTime
;
35 * Create a new {@link SearchBar}.
38 setLayout(new BorderLayout());
40 search
= new JButton(IconGenerator
.get(Icon
.search
, Size
.x16
));
41 UiHelper
.setButtonPressed(search
, realTime
);
42 search
.addActionListener(new ActionListener() {
44 public void actionPerformed(ActionEvent e
) {
46 UiHelper
.setButtonPressed(search
, realTime
);
50 fireActionPerformed();
55 text
= new JTextField();
56 text
.addKeyListener(new KeyAdapter() {
58 public void keyTyped(final KeyEvent e
) {
60 SwingUtilities
.invokeLater(new Runnable() {
63 boolean empty
= (text
.getText().isEmpty());
64 clear
.setVisible(!empty
);
67 fireActionPerformed();
73 text
.addActionListener(new ActionListener() {
75 public void actionPerformed(ActionEvent e
) {
77 fireActionPerformed();
82 clear
= new JButton(IconGenerator
.get(Icon
.clear
, Size
.x16
));
83 clear
.setBackground(text
.getBackground());
84 clear
.setVisible(false);
85 clear
.addActionListener(new ActionListener() {
87 public void actionPerformed(ActionEvent e
) {
89 clear
.setVisible(false);
92 fireActionPerformed();
96 add(search
, BorderLayout
.WEST
);
97 add(text
, BorderLayout
.CENTER
);
98 add(clear
, BorderLayout
.EAST
);
102 * Adds the specified action listener to receive action events from this
105 * @param listener the action listener to be added
107 public synchronized void addActionListener(ActionListener listener
) {
108 listenerList
.add(ActionListener
.class, listener
);
112 * Removes the specified action listener so that it no longer receives action
113 * events from this {@link SearchBar}.
115 * @param listener the action listener to be removed
117 public synchronized void removeActionListener(ActionListener listener
) {
118 listenerList
.remove(ActionListener
.class, listener
);
122 * Notify the listeners of an action.
124 protected void fireActionPerformed() {
125 ActionEvent e
= new ActionEvent(this, ActionEvent
.ACTION_PERFORMED
, getText());
126 Object
[] listeners
= listenerList
.getListenerList();
127 for (int i
= listeners
.length
- 2; i
>= 0; i
-= 2) {
128 if (listeners
[i
] == ActionListener
.class) {
129 ((ActionListener
) listeners
[i
+ 1]).actionPerformed(e
);
135 * Return the current text displayed by this {@link SearchBar}.
139 public String
getText() {
140 return text
.getText();