JSlider的Java / SWING错误

时间:2015-03-14 17:23:36

标签: java swing jslider

更新: 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)

有人可以帮我解决这个问题吗?

0 个答案:

没有答案