我需要创建一些JSpinner控件,在这里我可以检测按钮,同时使用当前的外观。我发现我可以很容易地做到这一点:
class CustomSpinnerUI extends BasicSpinnerUI {
@Override
protected Component createNextButton() {
// Add custom ActionListener.
}
@Override
protected Component createPreviousButton() {
// Add custom ActionListener.
}
}
问题在于,通过这样做,我最终得到一个看起来很讨厌的微调器,它不会像我的UI的其余部分那样使用相同的外观和感觉。我目前正在使用Nimbus
,但我需要支持不同的L& F配置。
我想过可能会设置某种动态代理,但找不到任何合适的Spinner
接口来让我这样做。
有人能想出解决这个问题的方法吗?我想我需要在没有子类化ActionListeners
的情况下点击按钮BasicSpinnerUI
,或者想办法让CustomSpinnerUI
使用正确的L& F.
修改:“默认外观” - > “当前的外观和感觉”。
答案 0 :(得分:5)
一个肮脏的技术答案(承认假设)问题“如何访问用于挂钩自定义actionListener的按钮”是遍历微调器的子节点并将侦听器添加到按名称标识的按钮:
JSpinner spinner = new JSpinner();
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("button " + ((Component) e.getSource()).getName());
}
};
for (Component child : spinner.getComponents()) {
if ("Spinner.nextButton".equals(child.getName())) {
((JButton) child).addActionListener(action);
}
if ("Spinner.previousButton".equals(child.getName())) {
((JButton) child).addActionListener(action);
}
}