Ошибка Java/SWING с JSlider

Обновление: у Тайлера Осборна был ответ:

Попробуйте объявить переменную ползунка в качестве конечной переменной. Когда вы пытаетесь сослаться на переменную во внешней области видимости, она должна быть окончательной.

Когда я пробовал это раньше, это просто вызывало больше ошибок компилятора, но теперь по какой-то причине это сработало. Спасибо!

Исходное сообщение
Я пытаюсь написать программу, которая выводит определенную информацию в некоторые текстовые поля в зависимости от положения ползунка. Я решил, что событие stateChanged ползунка было подходящим местом для этого. Однако, когда я использую там slider.getValue(), чтобы определить, какую информацию размещать, я получаю ошибку компилятора. Я только начал использовать Java с C++, поэтому я еще мало что знаю, и мне не удается понять решения, которые я нахожу в Google. Кто-нибудь может мне помочь?
Я поставил '>>' в строке, которая выдает ошибку.

Компилируемый код:

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)

Может ли кто-нибудь помочь мне решить эту проблему?


person Boet de Willigen    schedule 14.03.2015    source источник
comment
Попробуйте объявить переменную ползунка в качестве конечной переменной. Когда вы пытаетесь сослаться на переменную во внешней области видимости, она должна быть окончательной.   -  person Constant    schedule 14.03.2015
comment
Либо то, что рекомендует @TylerOsborne, либо объявите JSlider как поле в классе.   -  person Hovercraft Full Of Eels    schedule 14.03.2015
comment
Другие проблемы: ваше сообщение об исключении сообщает вам, что вы пытаетесь запустить код, который не компилируется, чего вы не должны никогда делать. Исправьте ошибки, которые выдает компилятор, перед попыткой запустить вашу программу, так как сообщения об ошибках от компилятора будут очень информативными. Также в будущем старайтесь использовать более подходящее название вопроса. "Java/SWING error with JSlider" ничего не говорит нам о вашей проблеме, которая на самом деле является не чем иным, как "Cannot refer to the non-final local variable" проблемой.   -  person Hovercraft Full Of Eels    schedule 14.03.2015
comment
Кроме того, я бы использовал JComboBox, а не JSlider для ваших моделей автомобилей, поскольку JComboBox может содержать разное количество элементов и на самом деле может содержать довольно много, не нарушая ваш графический интерфейс, как это сделал бы ваш JSlider. Кроме того, хотя пустые макеты и setBounds() могут показаться самым простым и лучшим способом создания сложных графических интерфейсов, в конечном итоге вы столкнетесь с трудностями при их использовании. Они не изменяют размер компонентов при изменении размера графического интерфейса, их сложно улучшать или поддерживать, они не работают при размещении в области прокрутки, они ужасно выглядят при просмотре на других платформах.   -  person Hovercraft Full Of Eels    schedule 14.03.2015
comment
Вместо этого вы захотите изучить и использовать менеджеры компоновки Swing.   -  person Hovercraft Full Of Eels    schedule 14.03.2015