【问题标题】:JSlider not updating?JSlider没有更新?
【发布时间】:2012-03-24 14:45:46
【问题描述】:

对于 Windows 中的整个绘图内容,我是初学者,我现在有点卡住了。目前我只是在测试这些东西。

import javax.swing.*;
import java.awt.*; 
import javax.swing.event.*;

public class test extends JFrame
{
    JSlider slider1; 

    public test()
    {
        slider1 = new JSlider(JSlider.VERTICAL, 0, 50, 0);
        setLayout(new FlowLayout(FlowLayout.TRAILING));

        add(slider1);
    }

    public void changeValue () 
    {
        slider1.setValue(25);
    }

    public static void main(String args[]) {
        test gui = new test();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(550,250);
        gui.setVisible(true);
    }
}

所以我创建了一个名为slider1 的JSlider,并为其指定了方向和值。当我调用 changeValue 方法时,它显然会更改 slider1 值。但是 GUI 上没有变化。 有人能指出我正确的方向吗? 它是否具有刷新 GUI 的功能?

【问题讨论】:

  • changeValue() 对我来说似乎工作正常...您确定正在调用此方法吗?将 gui.changeValue() 添加到 main 方法的末尾以查看。

标签: java swing jslider


【解决方案1】:

test() 构造函数中初始化slider1 变量后,添加这些行以便可以设置jslider 刻度值并在GUI 中显示:

slider1.setMajorTickSpacing( 5 );
slider1.setPaintLabels( true );

您可以自己更改刻度间距,设置为 5。使用add() 方法添加滑块不是一个好习惯,请改用getContentPane().add(),因此您的构造函数应如下所示:

public test2()
{
    slider1 = new JSlider(JSlider.VERTICAL, 0, 50, 0);
    setLayout(new FlowLayout(FlowLayout.TRAILING));
    slider1.setMajorTickSpacing( 5 );
    slider1.setPaintLabels( true );
    this.getContentPane().add(slider1);
}

我注意到您没有在main() 方法中调用changeValue() 方法。正如您的方法名称所暗示的那样,它似乎是一个设置器,但是您没有以参数方式给出设置值,这是一个好习惯吗?在我看来,事实并非如此。还有changeValue()setValue() 做同样的事情,为什么要创建一个冗余方法?无论如何,你可以使用这个:

public void changeValue (int newValue) 
{
    slider1.setValue(newValue);
}

在您的 main 方法中,使用以下语句:

test2 gui = new test2();
gui.changeValue( 25 );

要查看更改滑块值的直接效果,我的意思是更新它,使用按钮或其他组件,添加ActionListener 到它,以便您可以在单击时更新滑块值。

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        changeValue( 25 ); // change 25 to desired value.
    }   
});

【讨论】:

  • 非常感谢,您的帖子很有教育意义!
【解决方案2】:

你需要以某种方式调用 changeValue:

我刚刚添加了一个带有 ActionListener 的 JButton 来执行此操作,并设法使用以下代码使其对我有用:

package testswing;

import javax.swing.*;
import java.awt.*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JSliderTest extends JFrame
{
    JSlider slider1; 
    JButton button1; 

    public JSliderTest()
    {
        setLayout(new FlowLayout());

        slider1 = new JSlider(JSlider.VERTICAL, 0, 50, 0);
        add(slider1);

        button1 = new JButton("Centre JSlider!");
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                changeValue();
            }   
        });
        add(button1);
    }

    public void changeValue () 
    {
        slider1.setValue(25);
    }

    public static void main(String args[]) {
        JSliderTest gui = new JSliderTest();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(550,250);
        gui.setVisible(true);
    }
}

【讨论】:

    【解决方案3】:

    您没有在 main 方法中调用 changeValue()。使changeValue()方法和slider1static然后在main中调用changeValue()...

    static JSlider slider1; 
    
    public Test() {
        slider1 = new JSlider(JSlider.VERTICAL, 0, 50, 0);
        setLayout(new FlowLayout(FlowLayout.TRAILING));
    
        add(slider1);
    }
    
    public static void changeValue () {
        slider1.setValue(35);
    }
    
    public static void main(String args[]) {
        Test gui = new Test();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(550,250);
        gui.setVisible(true);
    
        changeValue();
    }
    

    最好将 Java 类名的每个单词的首字母大写。

    【讨论】:

    • 你认为用户在问这个吗?您是否打开了 IDE、复制、粘贴代码并查看结果?我觉得不行。首先,他应该更改构造函数,以便 jslider 可见。您的修复是正确的,他肯定应该调用更改方法,但是如果不使其可见,您将无法理解它是否已更新。再次检查问题标题。
    • @deporter:我确实在 IDE 中运行了代码,但没有从您的角度看到问题,从用户的角度来看这可能是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多