为什么我的JSlider没有更改值?

时间:2016-02-20 01:29:39

标签: java swing jbutton jtextfield jslider

我正在尝试创建我的程序,以便在JTextfield中输入的整数值可以存储到变量中。然后,当单击JButton时,此变量可以告诉JSlider将其头部移动到存储在变量中的整数值的头部。我的班级名是Camera.Java 代码显示没有错误,但是如果我单击我的JButton,没有任何反应,而是在控制台中看到此错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)
    at Camera.main(Camera.java:67)

我的代码:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;
import java.util.Scanner;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.*;

  public class Camera {

  static JButton addtolist;
    static Scanner input = new Scanner(System.in);
    static JSlider cam = new JSlider();
    static JTextField enterval = new JTextField();
    static int x ;

public static void main (String args[]){
    JFrame myFrame = new JFrame ("Matthew Damon on Mars");
    myFrame.setSize(300, 600);

    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    JLabel userinp = new JLabel("Enter input: ");

    cam = new JSlider(0, 15, 0);
    cam.setPaintLabels(true);

    enterval.setPreferredSize(new Dimension(100,80));

    addtolist = new JButton("Enter");
    addtolist.setPreferredSize(new Dimension(50,20));
    JTextField enterval1 = new JTextField();

    panel.add(addtolist);

    Hashtable<Integer, JLabel> table = new Hashtable<Integer, JLabel>();
    table.put(0, new JLabel("0"));
    table.put(1, new JLabel("1"));
    table.put(2, new JLabel("2"));
    table.put(3, new JLabel("3"));
    table.put(4, new JLabel("4"));
    table.put(5, new JLabel("5"));
    table.put(6, new JLabel("6"));
    table.put(7, new JLabel("7"));
    table.put(8, new JLabel("8"));
    table.put(9, new JLabel("9"));
    table.put(10, new JLabel("A"));
    table.put(11, new JLabel("B"));
    table.put(12, new JLabel("C"));
    table.put(13, new JLabel("D"));
    table.put(14, new JLabel("E"));
    table.put(15, new JLabel("F"));
    cam.setLabelTable(table);

    myFrame.add(cam, BorderLayout.SOUTH);
    myFrame.add(userinp, BorderLayout.NORTH);
    myFrame.add(enterval1, BorderLayout.NORTH);
    myFrame.add(panel, BorderLayout.CENTER);

    myFrame.setVisible(true);
    buttonAction();

}





public static void buttonAction() {

addtolist.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

          try {
                int x = Integer.parseInt(enterval.getText());
              cam.setValue(x);
          } catch (NumberFormatException npe) {
              // show a warning message
          }
    }

});
}       

 }

2 个答案:

答案 0 :(得分:2)

在用户有机会更改其值之前,您在创建程序时设置x。从actionPerformed方法中获取文本值,该方法应该是在用户选择了一个值之后,将其解析为一个数字并使用该值设置滑块。

    public void actionPerformed(ActionEvent e) {

        try {
            int x = Integer.parseInt(enterval.getText());
            cam.setValue(x);
        } catch (NumberFormatException npe) {
            // show a warning message
        }
    }

然后摆脱所有那些静态的废话。这里唯一应该是静态的方法是main,除了创建一个实例并将其设置为可见之外,它什么都不做。

请注意,优于使用JTextField,请使用JSpinnerJFormattedTextField,或者如果您真的卡住了DocumentFilter来限制用户的内容可以输入

答案 1 :(得分:1)

同样,你应该将大部分内容放入实例域并进入静态域。这意味着将大部分代码放在main方法之外以及其他方法和构造函数中,这意味着不要尝试从类中访问字段或方法,而是从实例中访问。例如,你的main方法应该只创建主实例,将它们连接起来并设置它们运行并且就是这样。它不应该用于构建特定的GUI组件。例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class CameraFoo extends JPanel {
    // only static field here is a constant.
    private static String TEXTS = "0123456789ABCDEF";
    private JSpinner spinner = new JSpinner();
    private JSlider slider = new JSlider(0, 15, 0);

    public CameraFoo() {    
        List<Character> charList = new ArrayList<>();
        Hashtable<Integer, JLabel> table = new Hashtable<>();
        for (int i = 0; i < TEXTS.toCharArray().length; i++) {
            char c = TEXTS.charAt(i);
            String myText = String.valueOf(c);
            JLabel label = new JLabel(myText);
            table.put(i, label);
            charList.add(c);
        }
        SpinnerListModel spinnerModel = new SpinnerListModel(charList);
        spinner.setModel(spinnerModel);
        slider.setLabelTable(table);
        slider.setPaintLabels(true);

        JPanel topPanel = new JPanel();
        topPanel.add(spinner);
        topPanel.add(new JButton(new ButtonAction("Press Me")));
        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(slider);
    }

    private class ButtonAction extends AbstractAction {
        public ButtonAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            char ch = (char) spinner.getValue();
            int value = TEXTS.indexOf(ch);
            slider.setValue(value);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

    private static void createAndShowGui() {
        CameraFoo mainPanel = new CameraFoo();
        JFrame frame = new JFrame("CameraFoo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}