Debounce textfield input so the parse function isn't run every keypress
This commit is contained in:
@@ -36,8 +36,6 @@ import java.awt.Rectangle;
|
|||||||
import java.awt.event.FocusAdapter;
|
import java.awt.event.FocusAdapter;
|
||||||
import java.awt.event.FocusEvent;
|
import java.awt.event.FocusEvent;
|
||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
import java.awt.event.KeyAdapter;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowAdapter;
|
||||||
@@ -468,9 +466,8 @@ public class ConfigPanel extends PluginPanel
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Method parse = item.clazz().getMethod(item.method(), String.class);
|
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)
|
catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex)
|
||||||
{
|
{
|
||||||
@@ -506,7 +503,7 @@ public class ConfigPanel extends PluginPanel
|
|||||||
openGroupConfigPanel(listItem, config, cd, false);
|
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;
|
showingPluginList = false;
|
||||||
|
|
||||||
@@ -781,17 +778,14 @@ public class ConfigPanel extends PluginPanel
|
|||||||
parsingLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
parsingLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
parsingLabel.setPreferredSize(new Dimension(PANEL_WIDTH, 15));
|
parsingLabel.setPreferredSize(new Dimension(PANEL_WIDTH, 15));
|
||||||
|
|
||||||
textField.addKeyListener(new KeyAdapter()
|
DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener();
|
||||||
{
|
listener.addChangeListener(e -> {
|
||||||
public void keyReleased(KeyEvent e)
|
if (cid.getItem().parse())
|
||||||
{
|
{
|
||||||
ConfigItem item = cid.getItem();
|
parseLabel(cid.getItem(), parsingLabel, textField.getText());
|
||||||
if (item.parse())
|
|
||||||
{
|
|
||||||
parseLabel(item, parsingLabel, textField.getText());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
textField.getDocument().addDocumentListener(listener);
|
||||||
|
|
||||||
item.add(textField, BorderLayout.CENTER);
|
item.add(textField, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user