Java JSlider没有更新吗?
我是一个在windows上画画的新手,现在我有点被卡住了。目前我只是在测试Java JSlider没有更新吗?,java,swing,jslider,Java,Swing,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);
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的功能 您没有在main方法中调用
changeValue()
。使changeValue()方法和滑块1static
,然后在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类名中每个单词的第一个字母大写。在
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.
}
});
您需要以某种方式调用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);
}
}
changeValue()对我来说似乎很好。。。您确定正在调用此方法吗?将gui.changeValue()添加到要查看的主方法的末尾。您认为用户会问这个问题吗?您是否打开IDE、复制、粘贴代码并查看结果?我认为不是。首先,他应该改变构造函数,这样jslider就可以被看到。您的修复是正确的,他应该明确地调用change方法,但是在不使其可见的情况下,您无法理解它是否已更新。再次检查问题标题。@Declader:我确实在IDE中运行了代码,但没有从您的角度看到问题,从用户的角度来看,这可能是正确的。非常感谢,您的帖子很有教育意义!