如何在 Java Swing 中为 JTextfield 设置数字范围(1-150 之间)

how to set a range of number (between 1-150) for a JTextfield in Java Swing

我正在编写一个 GUI 应用程序来输入工件的高度宽度和长度。当用户单击 "Test" 按钮时,如果字段为空并且输入大于 150,则应警告(通过 jlabel)。我正在努力解决一个问题 here.The 问题是它可以工作,但是当我 运行 根据数字格式编写程序时会出现很多警告。此外,当我单击 "Test" 按钮并且 JTextfield 为空时,它不会显示任何警告,但它只是忽略了这部分代码。我该如何解决这些问题?有没有更好的方法?

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.JOptionPane;

public class Machine_LearningApp {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Machine_LearningApp window = new Machine_LearningApp();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Machine_LearningApp() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(200, 200, 1182, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    frame.setTitle("Machine Learning Applikation");
    frame.getContentPane().setLayout(null);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setSize(screenSize);
    frame.setVisible(true);

    JLabel lblNewLabel = new JLabel("Workpiece recognition ");
    lblNewLabel.setAutoscrolls(true);
    lblNewLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    lblNewLabel.setHorizontalTextPosition(SwingConstants.CENTER);
    lblNewLabel.setOpaque(true);
    lblNewLabel.setForeground(new Color(255, 255, 255));
    lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 37));
    lblNewLabel.setBackground(new Color(0, 51, 102));
    lblNewLabel.setBounds(0, 0, 1440, 85);
    frame.getContentPane().add(lblNewLabel);

    JLabel lblHheDesBauteiles = new JLabel("Height");
    lblHheDesBauteiles.setForeground(new Color(255, 255, 255));
    lblHheDesBauteiles.setFont(new Font("Tahoma", Font.PLAIN, 15));
    lblHheDesBauteiles.setBounds(769, 246, 158, 36);
    frame.getContentPane().add(lblHheDesBauteiles);

    JLabel lblNewLabel_1 = new JLabel("Width");
    lblNewLabel_1.setForeground(new Color(255, 255, 255));
    lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 15));
    lblNewLabel_1.setBounds(769, 352, 158, 36);
    frame.getContentPane().add(lblNewLabel_1);

    JLabel lblLngeDesBauteiles = new JLabel("Length");
    lblLngeDesBauteiles.setForeground(new Color(255, 255, 255));
    lblLngeDesBauteiles.setFont(new Font("Tahoma", Font.PLAIN, 15));
    lblLngeDesBauteiles.setBounds(769, 474, 158, 36);
    frame.getContentPane().add(lblLngeDesBauteiles);

    JLabel lblBitteDieAngaben = new JLabel("Please enter here:");
    lblBitteDieAngaben.setForeground(new Color(255, 255, 255));
    lblBitteDieAngaben.setFont(new Font("Shree Devanagari 714", Font.ITALIC, 18));
    lblBitteDieAngaben.setBounds(896, 131, 395, 37);
    frame.getContentPane().add(lblBitteDieAngaben);

    JLabel lblNewLabel_2 = new JLabel("mm");
    lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel_2.setHorizontalTextPosition(SwingConstants.CENTER);
    lblNewLabel_2.setOpaque(true);
    lblNewLabel_2.setBounds(1232, 249, 42, 33);
    frame.getContentPane().add(lblNewLabel_2);

    JLabel lblNewLabel_2_1 = new JLabel("mm");
    lblNewLabel_2_1.setOpaque(true);
    lblNewLabel_2_1.setHorizontalTextPosition(SwingConstants.CENTER);
    lblNewLabel_2_1.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel_2_1.setBounds(1232, 355, 42, 33);
    frame.getContentPane().add(lblNewLabel_2_1);

    JLabel lblNewLabel_2_2 = new JLabel("mm");
    lblNewLabel_2_2.setOpaque(true);
    lblNewLabel_2_2.setHorizontalTextPosition(SwingConstants.CENTER);
    lblNewLabel_2_2.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel_2_2.setBounds(1232, 477, 42, 33);
    frame.getContentPane().add(lblNewLabel_2_2);

    JLabel leeresFeld = new JLabel("");
    leeresFeld.setFont(new Font("Lucida Grande", Font.BOLD | Font.ITALIC, 13));
    leeresFeld.setHorizontalAlignment(SwingConstants.CENTER);
    leeresFeld.setForeground(new Color(220, 20, 60));
    leeresFeld.setBounds(954, 523, 320, 36);
    frame.getContentPane().add(leeresFeld);

    JTextField Feld1 = new JTextField();
    Feld1.setSelectionColor(Color.GRAY);
    Feld1.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar();
            if (!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) {

                e.consume();

            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            leeresFeld.setText(" ");

        }
    });
    Feld1.setBounds(1022, 247, 143, 35);
    frame.getContentPane().add(Feld1);
    Feld1.setColumns(10);

    JTextField Feld2 = new JTextField();
    Feld2.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {

            char c = e.getKeyChar();
            if (!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) {

                e.consume();
            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            leeresFeld.setText(" ");
        }
    });

    Feld2.setBounds(1022, 354, 143, 35);
    frame.getContentPane().add(Feld2);
    Feld2.setColumns(10);

    JTextField Feld3 = new JTextField();
    Feld3.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {

            char c = e.getKeyChar();
            if (!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE))) {

                e.consume();
            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            leeresFeld.setText(" ");
        }
    });
    Feld3.setBounds(1022, 475, 143, 35);
    frame.getContentPane().add(Feld3);
    Feld3.setColumns(10);

    JButton btnPrfeDieAngaben = new JButton("Test");
    btnPrfeDieAngaben.setBorder(UIManager.getBorder("Button.border"));
    btnPrfeDieAngaben.setFont(new Font("Tahoma", Font.PLAIN, 14));
    btnPrfeDieAngaben.setBackground(Color.WHITE);
    btnPrfeDieAngaben.setBounds(1022, 590, 143, 36);
    frame.getContentPane().add(btnPrfeDieAngaben);

    btnPrfeDieAngaben.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int answer1 = Integer.parseInt(Feld1.getText());
            int answer2 = Integer.parseInt(Feld2.getText());
            int answer3 = Integer.parseInt(Feld3.getText());

            if (Feld1.getText().trim().isEmpty() && Feld2.getText().trim().isEmpty()
                    && Feld3.getText().trim().isEmpty()) {

                leeresFeld.setText("empty");

            }

            else if (Feld1.getText().trim().isEmpty()) {

                leeresFeld.setText("empty");

            } else if (Feld2.getText().trim().isEmpty()) {
                leeresFeld.setText("empty");
            } else if (Feld3.getText().trim().isEmpty()) {

                leeresFeld.setText("empty");
            }

            else if ((answer1 >= 1 && answer1 <= 150) && (answer2 >= 1 && answer2 <= 150)
                    && (answer3 >= 1 && answer3 <= 150)) {

                leeresFeld.setText("You entered: " + Feld1.getText() + " , " + Feld2.getText() + " , "
                        + Feld3.getText() + " , " + " in mm");

            }

            else {
                ImageIcon iconic = new ImageIcon(Machine_LearningApp.class.getResource("x-taste.png"));

                JOptionPane.showMessageDialog(null, "Enter only numbers between 1 und 150 mm!", "Warning",
                        JOptionPane.INFORMATION_MESSAGE, iconic);
            }

        }

    });

    JButton btnNewButton = new JButton("Go");
    btnNewButton.setHideActionText(true);
    btnNewButton.setFont(new Font("Lucida Grande", Font.BOLD | Font.ITALIC, 15));
    btnNewButton.setBackground(new Color(255, 255, 255));
    btnNewButton.setBorder(UIManager.getBorder("Button.border"));
    btnNewButton.setBounds(1042, 689, 112, 36);
    frame.getContentPane().add(btnNewButton);
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // Hier mit der Schnittstelle verbinden

        }
    });

    JButton btnNewButton_1 = new JButton("Reset");
    btnNewButton_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Feld1.setText("");
            Feld2.setText("");
            Feld3.setText("");
            leeresFeld.setText("");

        }
    });
    btnNewButton_1.setBorder(UIManager.getBorder("Button.border"));
    btnNewButton_1.setHorizontalTextPosition(SwingConstants.CENTER);
    btnNewButton_1.setFont(new Font("Tahoma", Font.PLAIN, 15));
    btnNewButton_1.setBackground(new Color(255, 255, 255));
    btnNewButton_1.setBounds(1208, 592, 96, 33);
    frame.getContentPane().add(btnNewButton_1);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(392, 541, -313, 31);
    frame.getContentPane().add(scrollPane);

    JLabel label_1 = new JLabel("");
    label_1.setOpaque(true);
    label_1.setBackground(new Color(0, 51, 102));
    label_1.setBounds(700, 97, 740, 781);
    frame.getContentPane().add(label_1);

    JLabel lblNewLabel_3 = new JLabel("");
    Image img1 = new ImageIcon(this.getClass().getResource("/LPS.png")).getImage();
    lblNewLabel_3.setIcon(new ImageIcon(img1));
    lblNewLabel_3.setBounds(104, 246, 447, 353);
    frame.getContentPane().add(lblNewLabel_3);

}

}

不是真的和答案。更多对您发布的代码的批评。

frame.getContentPane().setLayout(null);

这不是个好主意。您应该使用布局管理器。

lblNewLabel.setBounds(0, 0, 1440, 85);

如果您使用布局管理器,则无需计算 GUI 组件的大小和位置,例如 JLabel

Feld1.addKeyListener(new KeyAdapter() {

有几种更好的方法可以确保用户只能在 JTextField 中输入数字而不是按键监听器。一个聪明而狡猾的用户会简单地将文本粘贴到 JTextField 而不是键入它。

int answer1 = Integer.parseInt(Feld1.getText());

如果 Feld1 不包含数字(如果它为空则包括在内),方法 parseInt() 将抛出异常 - 这是您所说的实际问题,因为你发布了你的问题。在调用方法 parseInt() 或捕获异常之前,您应该检查 JTextField 是否为空。

我坚信要彻底、全面地学习Swing
我推荐教程 Creating a GUI With JFC/Swing。它几乎涵盖了 Swing.

的所有方面

除了包含 Swing 章节的一般 java 编程书籍外,还有几本专门介绍它的书籍。这是我读过的列表(排名不分先后)。请注意,它们可能很旧,但它们仍然非常相关。

  • Java Swing 权威指南,作者:John Zukowski
  • Java 基金会 类 大卫·弗拉纳根
  • Kim Topley 编写的核心 JFC 第二版
  • Java Marc Loy(和其他人)的 Swing 第 2 版
  • Matthew Robinson 和 Pavel Vorobiev 的 Swing 第 2 版

我个人最喜欢的是 Core JFC 2nd Edition,但每个人都有自己的最爱。我以前的一位同事最喜欢的是 Java Swing 2nd Edition

how to set a range of number (between 1-150) for a JTextfield in Java Swing

使用 JSpinner。它将:

  1. 自动只允许输入数字
  2. 整数值必须在定义的范围内。

阅读有关 How to Use Spinners 的 Swing 教程部分,了解更多信息和示例。