2012-06-14 68 views
2

我想要做的是这个, 当我输入的细节,它将验证如果textFiled为空时按下按钮,如果它是空的它将显示一条消息这样说。 然后它将移动到下一个文本文件类似于许多基于web的注册表格, 我试图找出的是为什么不会改变消息?错误与逻辑或重新绘制/重新验证Java JFrame

将此代码粘贴到ecilpse文件中并运行它应显示简单框架和我正在尝试执行的操作。

当名字字段为空时,该消息显示在帧的底部, 任何人都可以解释为什么当名字字段包含文本并且中间名不包含文本时它不显示下一条消息?

大部分逻辑位于代码的底部。

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

如果JTextField是空的,不应该将焦点保持与JTextField中使得误差可以是固定的?顺便说一句,您需要阅读并学习使用AWT/Swing布局管理器,而不是此“setBounds(...)”业务。它看起来可能不是这样,但长期的绝对定位会让你的工作变得更加困难。 –

+0

是的,先生,这是我的目标,因为我认为这将使数据验证更安全,如果我阻止进入下一个文本字段,如果以前的文本字段无效。我也认为,从长远来看,它会让它更加用户友好,我对摆动GUI编程还很新,并且还没有探索除基础之外的所有功能。 – Aaron

+0

考虑为您的JTextFields使用InputVerifier。 –

回答

4

我建议你使用InputVerifier,因为这将验证JTextField的内容是正确的(即要定义这个任何方式),让您在之前HFOE同意甚至离开JTextField。现在它不会阻止你按其他JButtons和其他的东西,所以如果你有一个提交按钮,你需要采取其他的预防措施。它检查以查看是否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(); 
     } 
     }); 
    } 
} 
+0

失败警告+1。 – trashgod

3
  1. 具有看看DocumentListener

  2. 上START_UP只启用第一JTextField,如果有的话(由你)字符被输入到第一JTextField中,然后启用第二的JTextField,等等...,

    如果你想过滤,更改或替换输出
  3. 从键盘附带的使用DocumentFilter

  4. change background for example to Color.red(来自DocumentListeners events),在JTextFields之一包含不正确长度的情况下,

  5. LayoutManagers

+0

我不同意这种建议,因为DocumentFilter用于在显示文本组件之前检查添加到文本组件的文本。我仍然认为InputVerifier会更好。我将以一个例子为例... –

+0

我不同意InputVerifier,文档是JTextComponent的模型,对于真正的代码,你必须写两次验证(当然可以使用InputVerifier)DocumentFilter可以从InputMask的枚举中获取InputMask,很抱歉,也许我会用NavigationsFilter和文档+1一起打扰伟大代码 – mKorbel

+0

使用InputVerifier比DocumentFilter更容易。 1+的建议作为DocumentFilters是有用的工具,并将有助于OP了解。 –