2012-03-07 99 views
4

我很喜欢整个绘图的东西在Windows中,我有点卡在眼下。目前我只是在测试这些东西。JSlider没有更新?

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); 
    } 
} 

因此,我创建了一个JSlider,我称之为slider1,我给它的方向和值。当我调用changeValue方法时,它显然会更改slider1值。但是在GUI上没有改变。 有人可以指引我进入正确的方向吗? 它有刷新GUI的东西吗?

+0

changeValue ()似乎为我工作正常...你确定这个方法被称为? 将gui.changeValue()添加到主要方法的末尾以查看。 – Steven 2012-03-07 03:43:24

回答

5

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); 
} 

我注意到,你是不是叫changeValue()方法main()方法。正如您的方法名称所暗示的那样,它似乎是一个setter,但是您不会以参数方式给出设置值,这是一个好习惯吗?在我看来,事实并非如此。而且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

非常感谢,你的帖子非常有教育意义! – swebonny 2012-03-07 04:15:30

1

你没有在你的主要方法中调用changeValue()。请给ChangeValue()方法和slider1 static,然后调用主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类名的最佳实践。

+0

你认为用户在问这个吗?你是否打开IDE,复制,粘贴代码并查看结果?我想不是。首先他应该改变构造函数,以便jslider可见。你的修复是正确的,他应该调用改变方法,但是如果没有使它可见,你不能理解它是否被更新。再次检查问题标题。 – Juvanis 2012-03-07 03:54:03

+0

@deporter:我确实在IDE中运行代码,但没有从您的角度看问题,从用户的角度来看这也许是正确的。 – neo108 2012-03-07 04:03:59

+0

感谢您的发布! – swebonny 2012-03-07 04:17:28

3

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

我只是增加了一个JButton有一个ActionListener要做到这一点,并设法使之为我工作用下面的代码:

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); 
    } 
} 
+0

非常感谢你! – swebonny 2012-03-07 04:16:27