Я отладил его через Eclipse и выяснил, что происходит.
- Часы в 15:00.
- Нажмите на кнопку.Свинг записать время последнего события на 15:00.
- Измените время на 14:00.
- Нажмите на кнопку.Swing игнорирует событие, потому что оно выглядит как мульти-клик.
Проблема здесь в том, что сравнение, выполненное Swing при проверке мульти-клика, таково:
if (lastTime != -1 && currentTime - lastTime < multiClickThreshhold) {
shouldDiscardRelease = true;
ЗдесьcurrentTime - lastTime
дает отрицательное значение.Это меньше, чем 0
(мой multiClickThreshhold
), поэтому оно не вызывает событие действия:
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
// Support for multiClickThreshhold
if (shouldDiscardRelease) {
shouldDiscardRelease = false;
return;
}
AbstractButton b = (AbstractButton) e.getSource();
ButtonModel model = b.getModel();
model.setPressed(false);
model.setArmed(false);
}
}
Весь источник, указанный выше, находится в javax.swing.plaf.basic.BasicButtonListener
.
The *У класса 1025 * есть setMultiClickThreshhold
, но он выдает IllegalArgumentException
в случае, если пороговое значение меньше 0
.
Итак, в качестве обходного пути я сделал это:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.Field;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) throws Exception {
final JFrame frame = new JFrame("frame");
final JButton button = new JButton("button");
removeMulticlickThreshold(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.out.println("Button Pressed!");
}
});
frame.add(button);
frame.setSize(200, 200);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
System.exit(0);
}
});
}
private static void removeMulticlickThreshold(final JButton button) throws Exception {
final Field multiClickThreshhold = AbstractButton.class.getDeclaredField("multiClickThreshhold");
multiClickThreshhold.setAccessible(true);
multiClickThreshhold.set(button, Long.MIN_VALUE);
}
}