diff options
Diffstat (limited to 'enigma-swing/src/main/java')
| -rw-r--r-- | enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java index 053adad..e65b661 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java | |||
| @@ -17,6 +17,7 @@ import java.awt.FlowLayout; | |||
| 17 | import java.awt.Font; | 17 | import java.awt.Font; |
| 18 | import java.awt.event.*; | 18 | import java.awt.event.*; |
| 19 | import java.util.*; | 19 | import java.util.*; |
| 20 | import java.util.concurrent.ConcurrentLinkedQueue; | ||
| 20 | 21 | ||
| 21 | import javax.swing.*; | 22 | import javax.swing.*; |
| 22 | import javax.swing.event.DocumentEvent; | 23 | import javax.swing.event.DocumentEvent; |
| @@ -207,7 +208,31 @@ public class SearchDialog { | |||
| 207 | this.classListModel = classListModel; | 208 | this.classListModel = classListModel; |
| 208 | classList.setModel(classListModel); | 209 | classList.setModel(classListModel); |
| 209 | 210 | ||
| 210 | currentSearch = su.asyncSearch(searchField.getText(), (idx, e) -> SwingUtilities.invokeLater(() -> classListModel.insertElementAt(e, idx))); | 211 | // handle these search result like minecraft scheduled tasks to prevent |
| 212 | // flooding swing buttons inputs etc with tons of (possibly outdated) invocations | ||
| 213 | record Order(int idx, SearchEntryImpl e) {} | ||
| 214 | Queue<Order> queue = new ConcurrentLinkedQueue<>(); | ||
| 215 | Runnable updater = new Runnable() { | ||
| 216 | @Override | ||
| 217 | public void run() { | ||
| 218 | if (SearchDialog.this.classListModel != classListModel || !SearchDialog.this.dialog.isVisible()) { | ||
| 219 | return; | ||
| 220 | } | ||
| 221 | |||
| 222 | // too large count may increase delay for key and input handling, etc. | ||
| 223 | int count = 100; | ||
| 224 | while (count > 0 && !queue.isEmpty()) { | ||
| 225 | var o = queue.remove(); | ||
| 226 | classListModel.insertElementAt(o.e, o.idx); | ||
| 227 | count--; | ||
| 228 | } | ||
| 229 | |||
| 230 | SwingUtilities.invokeLater(this); | ||
| 231 | } | ||
| 232 | }; | ||
| 233 | |||
| 234 | currentSearch = su.asyncSearch(searchField.getText(), (idx, e) -> queue.add(new Order(idx, e))); | ||
| 235 | SwingUtilities.invokeLater(updater); | ||
| 211 | } | 236 | } |
| 212 | 237 | ||
| 213 | public void dispose() { | 238 | public void dispose() { |