Debounce textfield input so the parse function isn't run every keypress

This commit is contained in:
sdburns1998
2019-06-06 15:30:36 +02:00
parent 0eae5e8452
commit 05ba61d44c
2 changed files with 65 additions and 13 deletions

View File

@@ -36,8 +36,6 @@ import java.awt.Rectangle;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
@@ -468,9 +466,8 @@ public class ConfigPanel extends PluginPanel
try
{
Method parse = item.clazz().getMethod(item.method(), String.class);
boolean result = (boolean) parse.invoke(null, value);
return result;
return (boolean) parse.invoke(null, value);
}
catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex)
{
@@ -506,7 +503,7 @@ public class ConfigPanel extends PluginPanel
openGroupConfigPanel(listItem, config, cd, false);
}
void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd, boolean refresh)
private void openGroupConfigPanel(PluginListItem listItem, Config config, ConfigDescriptor cd, boolean refresh)
{
showingPluginList = false;
@@ -781,17 +778,14 @@ public class ConfigPanel extends PluginPanel
parsingLabel.setHorizontalAlignment(SwingConstants.CENTER);
parsingLabel.setPreferredSize(new Dimension(PANEL_WIDTH, 15));
textField.addKeyListener(new KeyAdapter()
DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener();
listener.addChangeListener(e -> {
if (cid.getItem().parse())
{
public void keyReleased(KeyEvent e)
{
ConfigItem item = cid.getItem();
if (item.parse())
{
parseLabel(item, parsingLabel, textField.getText());
}
parseLabel(cid.getItem(), parsingLabel, textField.getText());
}
});
textField.getDocument().addDocumentListener(listener);
item.add(textField, BorderLayout.CENTER);

View File

@@ -0,0 +1,58 @@
package net.runelite.client.plugins.config;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
class DeferredDocumentChangedListener implements DocumentListener
{
private Timer timer;
private List<ChangeListener> listeners;
DeferredDocumentChangedListener()
{
listeners = new ArrayList<>(25);
timer = new Timer(350, e -> fireStateChanged());
timer.setRepeats(false);
}
void addChangeListener(ChangeListener listener)
{
listeners.add(listener);
}
private void fireStateChanged()
{
if (!listeners.isEmpty())
{
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners)
{
listener.stateChanged(evt);
}
}
}
@Override
public void insertUpdate(DocumentEvent e)
{
timer.restart();
}
@Override
public void removeUpdate(DocumentEvent e)
{
timer.restart();
}
@Override
public void changedUpdate(DocumentEvent e)
{
timer.restart();
}
}