【问题标题】:link two JSliders using a checkbox使用复选框链接两个 JSlider
【发布时间】:2015-05-27 23:17:15
【问题描述】:

我正在开发一个 java GUI,我有两个想要连接的 JSlider,使用一个复选框。具体来说,当复选框被选中并且我向一个方向滑动其中一个滑块时,我希望另一个滑块向相反的方向移动。两个滑块都从 -5 变为 +5,默认值为 0。 不幸的是,我不知道该怎么做,到目前为止我找不到任何解决这个问题的方法。 这是到目前为止的代码。对于这方面的任何帮助,我都非常感激。

JSlider sliderFilter1 = new JSlider(-5, 5, 0);
    sliderFilter1.setPaintTicks(true);
    sliderFilter1.setMajorTickSpacing(1);
    sliderFilter1.setBounds(10, 459, 200, 32);
    add(sliderFilter1);

    JSlider sliderFilter2 = new JSlider(-5, 5, 0);
    sliderFilter2.setMajorTickSpacing(1);
    sliderFilter2.setPaintTicks(true);
    sliderFilter2.setBounds(10, 503, 200, 32);
    add(sliderFilter2);

    JCheckBox chckbxConnectSlider = new JCheckBox("Connect Slider");
    chckbxConnectSlider.setBounds(6, 547, 131, 23);
    add(chckbxConnectSlider);

【问题讨论】:

    标签: java eclipse user-interface jslider


    【解决方案1】:

    通过使用ChangeListener,您可以对一个滑块进行编码,以便根据它的值更新另一个滑块。

    final JSlider sliderFilter1;
    final JSlider sliderFilter2;
    final JCheckBox chckbxConnectSlider;
    
    sliderFilter1 = new JSlider(-5, 5, 0);
    sliderFilter1.setPaintTicks(true);
    sliderFilter1.setMajorTickSpacing(1);
    sliderFilter1.setBounds(10, 459, 200, 32);
    add(sliderFilter1);
    
    sliderFilter2 = new JSlider(-5, 5, 0);
    sliderFilter2.setMajorTickSpacing(1);
    sliderFilter2.setPaintTicks(true);
    sliderFilter2.setBounds(10, 503, 200, 32);
    add(sliderFilter2);
    
    chckbxConnectSlider = new JCheckBox("Connect Slider");
    chckbxConnectSlider.setBounds(6, 547, 131, 23);
    add(chckbxConnectSlider);
    
    sliderFilter1.addChangeListener(new ChangeListener() {
        private int lastValue = 0;
        @Override
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider) e.getSource();
            if (lastValue != ((int) source.getValue()) && chckbxConnectSlider.isSelected()) {
                lastValue = (int) source.getValue();
                sliderFilter2.setValue(-((int) source.getValue()));
            }
        }
    });
    sliderFilter2.addChangeListener(new ChangeListener() {
        private int lastValue = 0;
        @Override
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider) e.getSource();
            if (lastValue != ((int) source.getValue()) && chckbxConnectSlider.isSelected()) {
                lastValue = (int) source.getValue();
                sliderFilter1.setValue(-((int) source.getValue()));
            }
        }
    });
    

    请注意,组件必须声明为final,以便可以从匿名函数中访问它们。

    更新: @MadProgrammer 说得对,这会导致一些递归问题(这很尴尬)。我更新了代码以检查值是否实际需要更改。使用实际的布局管理器而不是按位置布局组件也是一个好主意。请参阅 Oracle 的 A Visual Guide to Layout Managers

    【讨论】:

    • 1.不要使用setBounds,这表明您正在使用null 布局,这是不可取的。 2.当sliderFilter1改变时,它会改变sliderFilter2,这反过来又会改变sliderFilter1,这反过来又会改变sliderFilter2......你在做这样的事情时应该小心;)
    • 非常感谢@Parker Hoyes,它成功了!我实际上使用 WindowBuilder 进行 Eclipse 布局,但它在某个时候崩溃了,现在我无法再打开设计页面,这基本上就是为什么我被整个 setBounds 搞得一团糟。
    猜你喜欢
    • 2019-09-30
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多