- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望能够在按下某个键时增加 JSpinner
上的步长。到目前为止我尝试的是将 KeyListener
放在我的微调器上,当按下某个键时,更改步长的值。释放 key 后,它应该恢复为默认值。
我想我不必直接将 KeyListener
放到 JSpinner
上,而是放在它的按钮上。
老实说,我不知道如何实现这一点。这里让我感到困惑的是双重 Listener
。
这是我为 KeyListener
编写的代码:
public class SpinnerKeyIncrement implements KeyListener {
JSpinner spinner;
SpinnerNumberModel spinnerModel;
public SpinnerKeyIncrement(JSpinner s) {
this.spinner = s;
if(spinnerModel == null)
spinnerModel = (SpinnerNumberModel) spinner.getModel();
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
spinnerModel.setStepSize(.10);
}
else if(e.getKeyCode() == KeyEvent.VK_SHIFT) {
spinnerModel.setStepSize(1);
}
}
@Override
public void keyReleased(KeyEvent e) {
spinnerModel.setStepSize(0.01);
}
@Override
public void keyTyped(KeyEvent e) {}
}
}
最佳答案
同样,我会使用键绑定(bind)来解决这个问题,并且我会使用绑定(bind)到 JSpinner 的 InputMap 的绑定(bind),它在获得焦点时处于 Activity 状态:
InputMap inputMap = spinner.getInputMap(JComponent.WHEN_FOCUSED);
一个工作的小示例程序可能如下所示:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class ChangeStepSize extends JPanel {
private static final String DOUBLE_STEP = "double step";
public static final int SMALL_STEP_SIZE = 1;
public static final int BIG_STEP_SIZE = 10;
// bind to the "d" key, but you could use any key you'd like
private static final int SPECIAL_KEY = KeyEvent.VK_D;
private SpinnerNumberModel numberModel = new SpinnerNumberModel(50, 0, 100, 1);
private JSpinner spinner = new JSpinner(numberModel);
public ChangeStepSize() {
add(spinner);
// set up key bindings. First get InputMap and ActionMap
InputMap inputMap = spinner.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap actionMap = spinner.getActionMap();
// next set bindings for when key is pressed
boolean onKeyRelease = false;
KeyStroke keyStroke = KeyStroke.getKeyStroke(SPECIAL_KEY, 0, onKeyRelease);
inputMap.put(keyStroke, DOUBLE_STEP + onKeyRelease);
actionMap.put(DOUBLE_STEP + onKeyRelease, new DoubleStepAction(onKeyRelease));
// next set bindings for when key is released
onKeyRelease = true;
keyStroke = KeyStroke.getKeyStroke(SPECIAL_KEY, 0, onKeyRelease);
inputMap.put(keyStroke, DOUBLE_STEP + onKeyRelease);
actionMap.put(DOUBLE_STEP + onKeyRelease, new DoubleStepAction(onKeyRelease));
}
// our Action is passed in a parameter to indicate which state it
// gets activated in: key press or key release
private class DoubleStepAction extends AbstractAction {
private boolean onKeyRelease;
public DoubleStepAction(boolean onKeyRelease) {
this.onKeyRelease = onKeyRelease;
}
@Override
public void actionPerformed(ActionEvent e) {
if (onKeyRelease) {
numberModel.setStepSize(SMALL_STEP_SIZE);
} else {
numberModel.setStepSize(BIG_STEP_SIZE);
}
}
}
private static void createAndShowGui() {
ChangeStepSize mainPanel = new ChangeStepSize();
JFrame frame = new JFrame("ChangeStepSize");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
关于java - 按下某个键时增加 JSpinner 上的步长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723474/
我想计算一个圆上的所有点。我已经知道我可以使用 x = r * cos(theta) + x0, y = r * sin(theta) + y0 来计算点 - 但是我想知道是否有是根据我的像素 Can
我正在 pyqt 中构建一个工具,它有一个 slider 可以对几何区域进行排序。在某些情况下,数据的平均值或最小面积值与最大值之间可能存在极大差距。 让它像:面积 = [0.5、1.0、1.3、1.
我使用基本的指数移动平均线对一些数据进行平滑处理 filter : int main () { double a0 = 0.1; double input = 8.0; dou
给定一个整数列表是否存在找到值之间最大距离的默认方法? 所以如果我有这个数组 [1, 3, 5, 9, 15, 30] 值之间的最大步长是 15。列表对象是否有这样做的方法? 最佳答案 不,list
我试图通过每张幻灯片上 10 的幂来更改 slider 步长,但它无法正常工作。我不确定是应该使用 stepUp() 还是直接更改 step 的值。 这就是我如何增加 10 的幂: var incre
我有一个 python 函数,它接受一堆(1 个或 2 个)参数并返回一个二维数组。我一直在尝试使用 scipy curve_fit 和 least_squares 来优化输入参数,以便生成的二维数组
是否可以让 step 忽略 min 属性? 现在,它的步骤如下:2, 7, 12, 17, ... 相反,我希望它是:2, 5, 10, 15, 20, ... 我的真实代码实际上使用了这样的动态值
是否可以在纯css中设置一些宽度变化的步骤? 假设我的 div 宽度为 100%,因此当容器为 30px 时,它的宽度将为 30px。但是是否可以将一些“跳转”设置为 20px,以便当容器为 30px
抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。 要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容: 1. for ( auto & elem
我正在使用 Matlab 求解微分方程。我想强制 ode45 采取恒定步长,因此它在求解方程时总是在 T 轴上递增 0.01。我该怎么做? ode45 始终采取优化的随机步骤,我似乎无法弄清楚如何使其
我是一名优秀的程序员,十分优秀!