我正在尝试在JSlider上实现changelistener。我尝试了两种单独的方法都没有用。注释掉的部分是第一次尝试。现在实施的方案可能更适合我的目的。谁能指出这是怎么回事:
public class MixWindow extends JFrame implements ChangeListener{
private JPanel contentPane;
public static int uniA [] = new int [512];
ChangeListener sizeAction;
int level = 0;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MixWindow frame = new MixWindow();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
initUni();
}
public MixWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 800, 600);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JSlider slider = new JSlider(0,255);
slider.setOrientation(SwingConstants.VERTICAL);
slider.setBounds(66, 275, 72, 140);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setValue(uniA[0]);
//slider.addChangeListener(sizeAction);
contentPane.add(slider);
final JLabel label = new JLabel("");
label.setBounds(66, 262, 61, 16);
contentPane.add(label);
/*sizeAction=new ChangeListener()
{
public void stateChanged (ChangeEvent event)
{
System.out.println("This is getting silly");
JSlider slider=(JSlider)event.getSource();
level=slider.getValue();
uniA[0] = level;
String temp = String.valueOf(level);
label.setText(temp);
}
};*/
}
public static void initUni(){
for(int i = 0; i < uniA.length; i++){
uniA[i] = 0;
}
}
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Stuff has changed");
Object source = arg0.getSource();
System.out.println(arg0 + " has Changed");
}
}
最佳答案
ChangeListener
在第一种方法中不起作用的原因是,注册侦听器时,侦听器引用sizeAction
为null
。
slider.addChangeListener(sizeAction);
虽然这不会引发异常,但是在实例化时不会注册侦听器。
只需在定义了侦听器后允许该行出现,它将开始工作。
如果您希望使用其他
ChangeListener
实现,则可以使用:slider.addChangeListener(this);
关于java - JSlider changelistener无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13684207/