更新: Tyler Osborne得到了答案:
尝试将滑块变量声明为最终变量。当您尝试引用封闭范围中的变量时,它必须是最终的。
当我尝试此操作之前,它只是增加了编译器错误,但现在由于某些原因它起作用了。谢谢!
原帖
我试图编写一个程序,根据滑块的位置向某些文本框输出特定信息。我认为滑块的stateChanged事件是执行此操作的正确位置。但是当我在其中使用slider.getValue()来确定要放置的信息时,我收到编译器错误。我刚刚开始在C ++中使用Java,所以我还不知道很多,而且我没有理解我在谷歌上找到的解决方案。有人能帮帮我吗?
我把'>>'在给出错误的那一行。
可编译代码:
package autos;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSlider;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JInternalFrame;
import javax.swing.border.BevelBorder;
import javax.swing.BoxLayout;
import java.awt.GridLayout;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
public class AutoVerkoop extends JFrame {
private JPanel contentPane;
private JTextField txtType;
private JTextField txtModel;
private JTextField txtBouwjaar;
private JTextField txtPrijs;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AutoVerkoop frame = new AutoVerkoop();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public AutoVerkoop() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 658, 228);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("Chevrolet Avalance");
lblNewLabel.setBounds(278, 165, 131, 14);
contentPane.add(lblNewLabel);
JLabel lblBmwi = new JLabel("BMW 335i");
lblBmwi.setBounds(36, 165, 65, 14);
contentPane.add(lblBmwi);
JLabel lblHondaAccord = new JLabel("Honda Accord");
lblHondaAccord.setBounds(158, 165, 92, 14);
contentPane.add(lblHondaAccord);
JLabel lblVolvoC = new JLabel("Volvo C70");
lblVolvoC.setBounds(435, 165, 65, 14);
contentPane.add(lblVolvoC);
JLabel lblLandRoverLr = new JLabel("Land Rover LR3");
lblLandRoverLr.setBounds(529, 165, 138, 14);
contentPane.add(lblLandRoverLr);
JPanel panel = new JPanel();
panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
panel.setBounds(52, 11, 537, 89);
contentPane.add(panel);
panel.setLayout(null);
JLabel lblType = new JLabel("Merk:");
lblType.setBounds(10, 14, 46, 14);
panel.add(lblType);
JLabel lblModel = new JLabel("Model:");
lblModel.setBounds(10, 60, 46, 14);
panel.add(lblModel);
JLabel lblBouwjaar = new JLabel("Bouwjaar:");
lblBouwjaar.setBounds(290, 14, 71, 14);
panel.add(lblBouwjaar);
JLabel lblPrijs = new JLabel("Prijs:");
lblPrijs.setBounds(290, 60, 46, 14);
panel.add(lblPrijs);
txtType = new JTextField();
txtType.setEditable(false);
txtType.setBounds(66, 11, 133, 20);
panel.add(txtType);
txtType.setColumns(10);
txtModel = new JTextField();
txtModel.setEditable(false);
txtModel.setBounds(66, 57, 133, 20);
panel.add(txtModel);
txtModel.setColumns(10);
txtBouwjaar = new JTextField();
txtBouwjaar.setEditable(false);
txtBouwjaar.setBounds(371, 11, 133, 20);
panel.add(txtBouwjaar);
txtBouwjaar.setColumns(10);
txtPrijs = new JTextField();
txtPrijs.setEditable(false);
txtPrijs.setBounds(371, 57, 133, 20);
panel.add(txtPrijs);
txtPrijs.setColumns(10);
JSlider slider = new JSlider();
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
>> switch(slider.getValue()) {
case 0:
txtType.setText("BMW");
txtModel.setText("335i");
txtBouwjaar.setText("2007");
txtPrijs.setText("€42 350");
break;
default: break;
}
}
});
slider.setMaximum(4);
slider.setValue(0);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(1);
slider.setBounds(54, 111, 537, 51);
contentPane.add(slider);
}
}
编译器日志是这样的:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
Cannot refer to the non-final local variable slider defined in an enclosing scope
at autos.AutoVerkoop$2.stateChanged(AutoVerkoop.java:124)
at javax.swing.JSlider.fireStateChanged(Unknown Source)
at javax.swing.JSlider$ModelListener.stateChanged(Unknown Source)
at javax.swing.DefaultBoundedRangeModel.fireStateChanged(Unknown Source)
at javax.swing.DefaultBoundedRangeModel.setRangeProperties(Unknown Source)
at javax.swing.DefaultBoundedRangeModel.setMaximum(Unknown Source)
at javax.swing.JSlider.setMaximum(Unknown Source)
at autos.AutoVerkoop.<init>(AutoVerkoop.java:135)
at autos.AutoVerkoop$1.run(AutoVerkoop.java:35)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$300(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
有人可以帮我解决这个问题吗?