逻辑错误或重绘/重新验证Java JFrame [英] Error with logic or repaint/revalidate Java JFrame

查看:103
本文介绍了逻辑错误或重绘/重新验证Java JFrame的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

What I am trying to do is this, when I enter the details it will validate if the textFiled is empty when a button is pressed, if it is empty it will display a message saying that. Then it will move to the next textFile similar to many web based registration forms, what I am trying to find out is why wont the message change?

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

Pasting this code into an ecilpse file and running it should display the simple frame and what I am trying to do.

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

The message displays on the bottom of the frame when the firstname field is empty, can anyone explain why it doesn't show the next message when the firstname field containes text and the middlename contains no text?

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

Most of the logic is at the bottom of the code.

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





}
}


推荐答案

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

I recommend that you use an InputVerifier as this will verify that the contents of the JTextField are correct (any way that you wish to define this) before allowing you to even leave the JTextField. Now it won't stop you from pressing other JButtons and whatnot, so you'll need to take other precautions if you have a submit button. An example of a simple InputVerifier that checks to see if the JTextField is empty is shown below:

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

这篇关于逻辑错误或重绘/重新验证Java JFrame的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆