有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSlider不更新?

我是一个在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的功能


共 (3) 个答案

  1. # 1 楼答案

    您需要以某种方式调用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);
        }
    }
    
  2. # 2 楼答案

    您没有在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类名中每个单词的第一个字母大写

  3. # 3 楼答案

    test()构造函数中初始化slider1变量后,添加以下行,以便可以设置jslider tick值并在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()方法。正如您的方法名称所暗示的,它似乎是一个setter,但是您没有参数化地给出设置值,这是一个好的实践吗?在我看来,事实并非如此。而且changeValue()setValue()做了同样的事情,为什么要创建一个冗余方法呢?。不管怎样,你可以用这个:

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

    在主要方法中,使用以下语句:

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

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

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