简体   繁体   English

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

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

I am programming a GUI Application to enter the height width and length of a workpiece.我正在编写一个 GUI 应用程序来输入工件的高度宽度和长度。 When the user clicks on the "Test" Button it should be warned (through a jlabel) if the fields are empty and if the input is bigger than 150. I am struggling with a problem here.The problem is that it works but there are a lot of warnings when I run the program according to the Numberformat.当用户单击“测试”按钮时,如果字段为空并且输入大于 150,则应该警告(通过 jlabel)。我在这里遇到了一个问题。问题是它可以工作,但是有当我根据 Numberformat 运行程序时出现很多警告。 Also when I click the "Test" Button and the JTextfield are empty it does not show any warning but it just ignores this part of the code.此外,当我单击“测试”按钮并且 JTextfield 为空时,它不会显示任何警告,但它只是忽略了这部分代码。 How can I fix these problems?我该如何解决这些问题? Is there a better way?有没有更好的办法?

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);

}

}

Not really and answer.不是真的和答案。 More a critique of the code you posted.更多对您发布的代码的批评。

frame.getContentPane().setLayout(null);

Not a good idea.不是一个好主意。 You should use layout managers.您应该使用布局管理器。

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

If you use a layout manager, you don't need to calculate size and location of the GUI components, like JLabel .如果您使用布局管理器,则不需要计算 GUI 组件的大小和位置,例如JLabel

Feld1.addKeyListener(new KeyAdapter() {

There are several, better ways to make sure the user can only enter numbers into a JTextField than a key listener.有几种更好的方法可以确保用户只能在JTextField中输入数字而不是键侦听器。 A clever and devious user will simply paste text into the JTextField rather than typing into it.聪明而狡猾的用户只会将文本粘贴到JTextField中,而不是在其中输入。

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

If Feld1 does not contain a number (and that includes if it is empty), method parseInt() will throw an exception - which is the actual problem you say you are experiencing and because of it you posted your question.如果Feld1不包含数字(如果它为空,则包括数字),则方法parseInt()将引发异常 - 这是您说您遇到的实际问题,因此您发布了您的问题。 You should check whether the JTextField is empty before you call method parseInt() or alternatively catch the exception.您应该在调用方法parseInt()或捕获异常之前检查JTextField是否为空。

I firmly believe in thoroughly and comprehensively learning Swing .我坚信彻底全面地学习Swing
I recommend the tutorial Creating a GUI With JFC/Swing .我推荐使用 JFC/Swing 创建 GUI教程。 It covers almost all aspects of Swing .它几乎涵盖了Swing的所有方面。

Apart from general java programming books that contain chapters on Swing , there are also several books devoted entirely to it.除了包含 Swing 章节的一般java编程书籍外,还有几本书完全致力于它。 Here is a list of the ones I have read (in no particular order).这是我读过的列表(没有特别的顺序)。 Note that they may be old, nonetheless they are still very relevant.请注意,它们可能很旧,但它们仍然非常相关。

  • Definitive Guide to Java Swing by John Zukowski Java Swing 权威指南 John Zukowski
  • Java Foundation Classes in a Nutshell by David Flanagan Java 基础课程简述 David Flanagan
  • Core JFC 2nd Edition by Kim Topley Kim Topley 的核心 JFC 第 2 版
  • Java Swing 2nd Edition by Marc Loy (and others) Java Swing 2nd Edition by Marc Loy(和其他人)
  • Swing 2nd Edition by Matthew Robinson and Pavel Vorobiev Swing 第 2 版,作者:Matthew Robinson 和 Pavel Vorobiev

My personal favorite is Core JFC 2nd Edition but each person has his favorite.我个人最喜欢的是Core JFC 2nd Edition ,但每个人都有他的最爱。 The favorite of one of my previous work colleagues was Java Swing 2nd Edition我以前的一位同事最喜欢的是Java Swing 2nd Edition

how to set a range of number (between 1-150) for a JTextfield in Java Swing如何为 Java Swing 中的 JTextfield 设置数字范围(1-150 之间)

Use a JSpinner .使用JSpinner It will:它会:

  1. automatically only allow numbers to be entered自动只允许输入数字
  2. the integer value must be in the defined range. integer 值必须在定义的范围内。

Read the section from the Swing tutorial on How to Use Spinners for more information and examples.阅读 Swing 教程中有关如何使用微调器的部分以获取更多信息和示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM