【问题标题】:Update GUI components after loading settings JAVA加载设置 JAVA 后更新 GUI 组件
【发布时间】:2017-04-14 11:40:42
【问题描述】:

我有一个主要带有滑块和组合框的 GUI 应用程序。我使用滑块和组合来更改项目中各个类的值和参数。我正在尝试实现保存和加载此参数的可能性,并且我已经使用首选项 API 完成了此操作。 我可以保存和加载参数,但是当我加载它们时,我可以看到值的变化,这样就可以了,但是 GUI 不会更新以反映这些新值。有没有办法告诉 GUI 这样做?

例如,我有一个频率滑块,可以改变振荡器中的频率值。如果我用滑块更改值,保存它,再次更改滑块的值,然后加载保存的值,我可以听到它已经改变但滑块没有移动。(有道理,因为我没有告诉它也)。我可以以某种方式将滑块的位置与该频率值绑定吗?

    //OSC1 slider
    JSlider Osc1FreqSlider = new JSlider(SwingConstants.HORIZONTAL, MIN_OSC_FREQ, MAX_OSC_FREQ, NOTE_A_FREQ);
    Osc1FreqSlider.setOpaque(false);
    Osc1FreqSlider.setMajorTickSpacing(50000);
    Osc1FreqSlider.setMinorTickSpacing(50);

Osc1FreqSlider.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
            JSlider source = (JSlider) e.getSource();
            settings.setOsc1Freq((float)source.getValue()/100);

        }
    });

设置类

public void setOsc1Freq(float freq) {
    m_Osc1Freq = freq;
}

【问题讨论】:

  • 是的,有办法,但它的实现将完全取决于您的代码。
  • 好的,所以滑块移动,调用保存值的​​单例类中的 set 方法。当我保存时,我使用 get 方法获取值,当我加载时,我使用该单例类中的 set 方法设置它如果你告诉我哪些细节可能对你有帮助,我很乐意告诉你我所能做的一切。感谢您的帮助:)
  • 请考虑发布相关代码,minimal reproducible example,与您的问题。

标签: java user-interface combobox preferences jslider


【解决方案1】:

setOsc1Freq( freq ) 之后你必须做jSlider.setValue( freq )

我在自己的项目中这样做的方式是,我从不使用像 float freq 这样的独立原始值;相反,我有一个带有 getter 和 setter 的 observable 类,它在值更改时发出一个事件,然后我将每个控件包装在另一个知道如何与这样的 observable 交互的类中。因此,每次控件的值发生变化时,可观察对象中的值也会发生变化,而且,每次我的程序更改可观察对象的值时,控件也会注意到并更新自身。

我认为几乎不可能编写任何类型的 gui 没有此功能,但显然我似乎与存在无数不支持此功能的 gui 框架相矛盾,并迫使您重新-发明。

【讨论】:

  • 您好,感谢您的回复,您能否详细介绍一下您使用 guis 的方式? :)
  • 对不起 Otenko,但那太宽泛了,我必须写一篇论文并发布不适合发布的代码。但是您可以查看“可观察”模式。本质上,并没有说只有 gui 控件可以是可观察的。你可以让你的应用逻辑也包含 observables,然后你可以绑定两者。
  • 好吧,我得翻出我的设计模式书看看 :) 无论如何谢谢
【解决方案2】:

(代表 OP 发布).

我解决了我的问题,方法是拆分组件声明,将它们移动到另一个单例类,创建访问器方法,然后在 gui 类中将变量分配给 getter。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多