首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSlider没有更新吗?

JSlider没有更新吗?
EN

Stack Overflow用户
提问于 2012-03-07 11:09:52
回答 3查看 2.4K关注 0票数 5

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

代码语言:javascript
复制
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有关?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-07 11:51:25

test()构造函数中初始化slider1变量后,添加以下行,以便可以设置jslider tick值并在图形用户界面中可见:

代码语言:javascript
复制
slider1.setMajorTickSpacing( 5 );
slider1.setPaintLabels( true );

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

代码语言:javascript
复制
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()也做了同样的事情,为什么要创建一个冗余的方法呢?无论如何,您可以使用以下命令:

代码语言:javascript
复制
public void changeValue (int newValue) 
{
    slider1.setValue(newValue);
}

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

代码语言:javascript
复制
test2 gui = new test2();
gui.changeValue( 25 );

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

代码语言:javascript
复制
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        changeValue( 25 ); // change 25 to desired value.
    }   
});
票数 6
EN

Stack Overflow用户

发布于 2012-03-07 11:56:41

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

我刚刚添加了一个带有ActionListener的JButton来做这件事,并设法用下面的代码让它为我工作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-03-07 11:45:20

您没有在main方法中调用changeValue()。让changeValue()方法和slider1 static,然后在main中调用changeValue() ...

代码语言:javascript
复制
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类名称的每个单词的第一个字母大写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9595282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档