Java JSlider不会更改该值并保持不变
我刚刚用eclipse制作了一个java程序来 使用jslider更改Jprogress条,但滑块值不会更改它保持不变,以下是代码: 头等舱:Java JSlider不会更改该值并保持不变,java,jprogressbar,jslider,Java,Jprogressbar,Jslider,我刚刚用eclipse制作了一个java程序来 使用jslider更改Jprogress条,但滑块值不会更改它保持不变,以下是代码: 头等舱: package pro; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JProgressBar; public class pro1 { int
package pro;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class pro1 {
int value;
public static void main(String[] args) {
// TODO Auto-generated method stub
//setting the objects
final pro1 p = new pro1();
final pro2 p2 = new pro2();
//adding the JFrame.
JFrame fr = new JFrame();
fr.setVisible(true);
fr.setSize(380, 80);
fr.setLayout(new FlowLayout(FlowLayout.LEFT));
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//adding the JProgressBar.
JProgressBar pb = new JProgressBar(0,100);
pb.setOpaque(false);
Color c = new Color (0,200,0);
pb.setForeground(c);
pb.setValue(p.value);
//adding the JPanel
JPanel panel = new JPanel();
panel.add(pb);
panel.add(p2.slider());
//adding the panel to the frame.
fr.add(panel);
fr.revalidate();
}
}
package pro;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class pro2 {
//setting the object
pro1 p = new pro1();
public JSlider slider(){
//adding the slider.
final JSlider s = new JSlider ();
s.setMinimum(0);
s.setMaximum(100);
s.setValue(0);
s.setMajorTickSpacing(10);
s.setPaintTicks(true);
s.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
p.value = s.getValue();
}
});
return s;
}
二等舱:
package pro;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class pro1 {
int value;
public static void main(String[] args) {
// TODO Auto-generated method stub
//setting the objects
final pro1 p = new pro1();
final pro2 p2 = new pro2();
//adding the JFrame.
JFrame fr = new JFrame();
fr.setVisible(true);
fr.setSize(380, 80);
fr.setLayout(new FlowLayout(FlowLayout.LEFT));
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//adding the JProgressBar.
JProgressBar pb = new JProgressBar(0,100);
pb.setOpaque(false);
Color c = new Color (0,200,0);
pb.setForeground(c);
pb.setValue(p.value);
//adding the JPanel
JPanel panel = new JPanel();
panel.add(pb);
panel.add(p2.slider());
//adding the panel to the frame.
fr.add(panel);
fr.revalidate();
}
}
package pro;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class pro2 {
//setting the object
pro1 p = new pro1();
public JSlider slider(){
//adding the slider.
final JSlider s = new JSlider ();
s.setMinimum(0);
s.setMaximum(100);
s.setValue(0);
s.setMajorTickSpacing(10);
s.setPaintTicks(true);
s.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
p.value = s.getValue();
}
});
return s;
}
我还尝试将滑块的值指定给一个值并打印出来,但它保持在我设置的默认值,即0
代码中有什么错误吗???在主方法中,您正在创建
pro1
的实例。在pro2
中,您正在创建pro1
的新实例。每个实例都有自己的值
此外,当您更改值时,进度条不会注意到这一点。您必须显式调用JProgressBar#setValue
代码中还存在一些其他问题,这里是一个稍微修改的版本,它展示了一种可能的方法
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SliderProgressTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
//adding the JFrame.
JFrame fr = new JFrame();
fr.setSize(380, 80);
fr.setLayout(new FlowLayout(FlowLayout.LEFT));
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//adding the JProgressBar.
JProgressBar pb = new JProgressBar(0,100);
pb.setOpaque(false);
Color c = new Color (0,200,0);
pb.setForeground(c);
//adding the JPanel
JPanel panel = new JPanel();
panel.add(pb);
panel.add(createSlider(pb));
//adding the panel to the frame.
fr.add(panel);
fr.setVisible(true);
}
private static JSlider createSlider(final JProgressBar pb)
{
//adding the slider.
final JSlider s = new JSlider ();
s.setMinimum(0);
s.setMaximum(100);
s.setValue(0);
s.setMajorTickSpacing(10);
s.setPaintTicks(true);
s.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent e) {
pb.setValue(s.getValue());
}
});
return s;
}
}
Pro2中的P1引用的是它自己的实例,而不是屏幕上的实例。哇,感谢它真的工作了这么多,我不明白问题出在哪里。@user3314952滑块更改了实例的值pro1 p=new pro1()在pro2
中创建的代码>。但是进度条显示了pro1 p=new pro1()中的值在主方法中创建的代码>。因此,使用滑块修改的值
与进度条中显示的值
不同。(此外,进度条未更新)