逻辑错误或重绘/重新验证Java JFrame

时间:2012-06-14 22:44:12

标签: java swing jtextfield inputverifier

我想做的是这个, 当我输入细节时,它将验证按下按钮时textFiled是否为空,如果它是空的,它将显示一条消息说明。 然后它将移动到下一个textFile,类似于许多基于Web的注册表单, 我想要找出的是为什么消息不会改变?

将此代码粘贴到ecilpse文件中并运行它应该显示简单的框架以及我想要做的事情。

当firstname字段为空时,消息显示在框架的底部, 谁可以解释为什么当firstname字段包含文本而middlename不包含文本时它不会显示下一条消息?

大部分逻辑都在代码的底部。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import javax.swing.UIManager;
import javax.swing.JPanel;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JRadioButton;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;

public class start {

private JFrame frame;
private JTextField tfFirstname;
private JTextField tfMiddlenames;
private JTextField tfSurname;

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

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

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();

    frame.setBounds(100, 100, 505, 429);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    frame.getContentPane().setLayout(null);

    final JPanel panelClientNew = new JPanel();
    panelClientNew.setBackground(new Color(0, 102, 255));
    panelClientNew.setBounds(10, 11, 469, 299);
    frame.getContentPane().add(panelClientNew);
    panelClientNew.setLayout(null);

    JLabel lblFirstname = new JLabel("Firstname :");
    lblFirstname.setHorizontalAlignment(SwingConstants.RIGHT);
    lblFirstname.setVerticalAlignment(SwingConstants.BOTTOM);
    lblFirstname.setForeground(new Color(255, 255, 255));
    lblFirstname.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblFirstname.setBounds(10, 16, 163, 14);
    panelClientNew.add(lblFirstname);

    tfFirstname = new JTextField();
    tfFirstname.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfFirstname.setBounds(177, 10, 282, 27);
    panelClientNew.add(tfFirstname);
    tfFirstname.setColumns(10);

    JLabel lblMiddlenames = new JLabel("Middlenames :");
    lblMiddlenames.setHorizontalAlignment(SwingConstants.RIGHT);
    lblMiddlenames.setForeground(new Color(255, 255, 255));
    lblMiddlenames.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMiddlenames.setBounds(10, 47, 163, 14);
    panelClientNew.add(lblMiddlenames);

    tfMiddlenames = new JTextField();
    tfMiddlenames.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfMiddlenames.setBounds(177, 41, 282, 27);
    panelClientNew.add(tfMiddlenames);
    tfMiddlenames.setColumns(10);

    JLabel lblSurname = new JLabel("Surname :");
    lblSurname.setHorizontalAlignment(SwingConstants.RIGHT);
    lblSurname.setForeground(new Color(255, 255, 255));
    lblSurname.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblSurname.setBounds(10, 78, 163, 14);
    panelClientNew.add(lblSurname);

    tfSurname = new JTextField();
    tfSurname.setFont(new Font("Tahoma", Font.PLAIN, 13));
    tfSurname.setBounds(177, 72, 282, 27);
    panelClientNew.add(tfSurname);
    tfSurname.setColumns(10);



    JButton btnAdd = new JButton("Add");
    btnAdd.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent arg0) {
            /*
             * 
             * 
             *
             *I am trying to create a message that validates on certain circumstances
             * 
             * 
             * 
             */

            if(tfFirstname.getText().equals(null) || tfFirstname.getText().equals("") || tfFirstname.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Firstname :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);
                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else if (tfMiddlenames.getText().equals(null) || tfMiddlenames.getText().equals("") || tfMiddlenames.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Middlenames :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);

                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else if (tfSurname.getText().equals(null) || tfSurname.getText().equals("") || tfSurname.getText().equals(false)) {
                JPanel panelMessage = new JPanel();
                panelMessage.setBackground(new Color(30, 144, 255));
                panelMessage.setBounds(10, 321, 469, 29);
                frame.getContentPane().add(panelMessage);

                JLabel lblPersonSaved = new JLabel("Please Enter Surname :");
                lblPersonSaved.setForeground(new Color(255, 255, 255));
                lblPersonSaved.setFont(new Font("Tahoma", Font.BOLD, 15));
                panelMessage.add(lblPersonSaved);
                frame.revalidate();
                panelMessage.revalidate();
                frame.repaint();

            }
            else {


                //Validation has passed

            }
        }
    });
    btnAdd.setBounds(370, 265, 89, 23);
    panelClientNew.add(btnAdd);





}
}

2 个答案:

答案 0 :(得分:4)

我建议您使用InputVerifier,因为这样可以在允许您甚至离开JTextField之前验证JTextField的内容是否正确(以任何方式定义此内容)。现在它不会阻止你按下其他JButton等等,所以如果你有一个提交按钮,你需要采取其他预防措施。检查JTextField是否为空的简单InputVerifier示例如下所示:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class InputVerifierExample extends JPanel {
   public static final Color WARNING_COLOR = Color.red;
   private JTextField firstNameField = new JTextField(10);
   private JTextField middleNameField = new JTextField(10);
   private JTextField lastNameField = new JTextField(10);
   private JTextField[] nameFields = { 
         firstNameField, 
         middleNameField,
         lastNameField };
   private JLabel warningLabel = new JLabel("  ");

   public InputVerifierExample() {
      warningLabel.setOpaque(true);

      JPanel namePanel = new JPanel();
      namePanel.add(new JLabel("Name:"));
      MyInputVerifier verifier = new MyInputVerifier();
      for (JTextField field : nameFields) {
         field.setInputVerifier(verifier);
         namePanel.add(field);
      }
      namePanel.add(new JButton(new SubmitBtnAction()));

      setLayout(new BorderLayout());
      add(namePanel, BorderLayout.CENTER);
      add(warningLabel, BorderLayout.SOUTH);
   }

   private class SubmitBtnAction extends AbstractAction {
      public SubmitBtnAction() {
         super("Submit");
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         // first check all fields aren't empty
         for (JTextField field : nameFields) {
            if (field.getText().trim().isEmpty()) {
               return;  // return if empty
            }
         }
         String name = "";
         for (JTextField field : nameFields) {
            name += field.getText() + " ";
            field.setText("");
         }
         name = name.trim();
         JOptionPane.showMessageDialog(InputVerifierExample.this, name, "Name Entered",
               JOptionPane.INFORMATION_MESSAGE);
      }
   }

   private class MyInputVerifier extends InputVerifier {

      @Override
      public boolean verify(JComponent input) {
         JTextField field = (JTextField) input;
         if (field.getText().trim().isEmpty()) {
            warningLabel.setText("Please do not leave this field empty");
            warningLabel.setBackground(WARNING_COLOR);
            return false;
         }
         warningLabel.setText("");
         warningLabel.setBackground(null);
         return true;
      }

   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("InputVerifier Example");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new InputVerifierExample());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案 1 :(得分:3)

  1. 查看DocumentListener

  2. 在start_up上只启用第一个JTextField,如果在第一个JTextField中输入任何(由你决定)字符,然后启用第二个JTextField,依此类推......,

  3. 如果您想过滤,更改或替换来自键盘的输出,请使用DocumentFilter

  4. change background for example to Color.red(来自DocumentListeners events),如果JTextFields中的一个包含incorect lenght,数据,例如

  5. 同意HFOE关于LayoutManagers