2015-10-17 56 views
0

這是一個使用JDialog添加或編輯工單的簡單程序。當對話框出現時,用戶將輸入信息到字段(名字,日期,位置,帳單費率等)。該程序必須驗證每個這些字段。問題是,如果我留下一個空白字段,然後我選擇下一個字段,則會彈出錯誤消息。實際上,這不是一個問題,它的工作原理應該是這樣的,但是,我想這樣做是爲了讓所有空白字段都有效,直到用戶單擊SAVE。任何建議或想法?我粘貼了下面的整個程序,所以可以自己編譯和運行它,謝謝!如何使空白字段有效直到用戶單擊SAVE -Java

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import java.lang.*; 
import java.awt.event.*; 
import javax.swing.filechooser.*; 
import java.io.*; 
import static javax.swing.GroupLayout.Alignment.*; 

public class WorkOrderProject 
{ 
    public static void main (String args[]) 
    { 
     new MyFrameClass(); 
    } 
} 

class MyFrameClass extends JDialog implements ActionListener 
{ 
JButton addButton, editButton; 
    JPanel buttonPanel; 
    WorkOrder workOrderToEdit = new WorkOrder(); 

    MyFrameClass() 
    { 
     Container cp; 

     addButton = new JButton("ADD"); 
     addButton.addActionListener(this); 
     addButton.setActionCommand("ADD"); 

     editButton = new JButton("EDIT"); 
     editButton.addActionListener(this); 
     editButton.setActionCommand("EDIT"); 

     buttonPanel = new JPanel(new FlowLayout()); 
     buttonPanel.add(addButton); 
     buttonPanel.add(editButton); 

     cp = getContentPane(); 
     cp.add(buttonPanel, BorderLayout.NORTH); 

     setupMainFrame(); 
    } 

    void setupMainFrame() 
    { 
     Toolkit tk; 
    Dimension d; 

    tk = Toolkit.getDefaultToolkit(); 
    d = tk.getScreenSize(); 
    setLayout(new FlowLayout()); 
    setTitle("Work Orders"); 
    setSize(d.width/2, d.height/2); 
    setLocation(d.width/4, d.height/4); 
    setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
    if(e.getActionCommand().equals("ADD")) 
    { 
     System.out.println("ADD"); 
     new MyDialog(); 
    } 
    else if(e.getActionCommand().equals("EDIT")) 
    { 
     System.out.println("EDIT"); 
     new MyDialog(workOrderToEdit); 
    } 
    } 
} 

class MyDialog extends JDialog implements ActionListener 
{ 
JPanel buttonPanel, fieldPanel; 
JButton button1, button2, button3, button4; 
GroupLayout layout; 
WorkOrder workOrderToEdit; 
String[] comboTypes = { "Sales", "Hardware", "Electronics" }; 
JComboBox<String> comboTypesList; 

public MyDialog() 
{ 
    Container cp; 

    button1 = new JButton("SAVE"); 
    button1.addActionListener(this); 
    button1.setActionCommand("SAVE"); 
    button2 = new JButton("CANCEL"); 
    button2.addActionListener(this); 
    button2.setActionCommand("CANCEL"); 
    button2.setVerifyInputWhenFocusTarget(false); 
    button3 = new JButton("SAVE AND NEW"); 
    button3.addActionListener(this); 
    button3.setActionCommand("SAVE AND NEW"); 

    buttonPanel = new JPanel(new FlowLayout()); 
    buttonPanel.add(button2); 
    buttonPanel.add(button1); 
    buttonPanel.add(button3); 

    fieldPanel = setFields(); 

    cp = getContentPane(); 
    cp.add(fieldPanel, BorderLayout.NORTH); 
    cp.add(buttonPanel, BorderLayout.SOUTH); 

    setTitle("Add New Work Order"); 
    setupMainFrame(); 

} 

public MyDialog(WorkOrder w) 
{ 
    Container cp; 

    button1 = new JButton("SAVE"); 
    button1.addActionListener(this); 
    button1.setActionCommand("SAVE"); 
    button2 = new JButton("CANCEL"); 
    button2.addActionListener(this); 
    button2.setActionCommand("CANCEL"); 
    button2.setVerifyInputWhenFocusTarget(false); 

    buttonPanel = new JPanel(new FlowLayout()); 
    buttonPanel.add(button2); 
    buttonPanel.add(button1); 

    fieldPanel = setFields(); 

    getContentPane().add(fieldPanel, BorderLayout.NORTH); 
    getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

    setTitle("Edit Work Order"); 
    setupMainFrame(); 

} 


void setupMainFrame() 
{ 
    Toolkit tk; 
    Dimension d; 

    tk = Toolkit.getDefaultToolkit(); 
    d = tk.getScreenSize(); 
    setLayout(new FlowLayout()); 
    setSize(d.width/3, d.height/3); 
    setLocation(d.width/3, d.height/3); 
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    setModal(true); 
    setVisible(true); 
} 

JPanel setFields() 
{ 
    GroupLayout layout; 
    JPanel p; 
    JLabel label1, label2, label3, label4, label5; 
    JTextField text1, text2, text3, text4, text5; 
    String[] comboTypes = { "-Select-" ,"Sales", "Hardware", "Electronics" }; 

    comboTypesList = new JComboBox<>(comboTypes); 
    comboTypesList.addActionListener(this); 

    label1 = new JLabel("Name: "); 
    label2 = new JLabel("Department: "); 
    label3 = new JLabel("Date of request: "); 
    label4 = new JLabel("Date request was fulfilled: "); 
    label5 = new JLabel("Billing rate: "); 
    text1 = new JTextField(20); 
    text1.setInputVerifier(new NameVerifier()); 
    text2 = new JTextField(20); 
    text3 = new JTextField(20); 
    text4 = new JTextField(20); 
    text5 = new JTextField(20); 

    p = new JPanel(); 

    layout = new GroupLayout(p); 
    p.setLayout(layout); 
    layout.setAutoCreateGaps(true); 
    layout.setAutoCreateContainerGaps(true); 

    GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); 
    hGroup.addGroup(layout.createParallelGroup().addComponent(label1).addComponent(label2).addComponent(label3).addComponent(label4).addComponent(label5)); 
    hGroup.addGroup(layout.createParallelGroup().addComponent(text1).addComponent(comboTypesList).addComponent(text3).addComponent(text4).addComponent(text5)); 
    layout.setHorizontalGroup(hGroup); 


    GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); 
    vGroup.addGroup(layout.createParallelGroup(BASELINE).addComponent(label1).addComponent(text1)); 
    vGroup.addGroup(layout.createParallelGroup(BASELINE).addComponent(label2).addComponent(comboTypesList)); 
    vGroup.addGroup(layout.createParallelGroup(BASELINE).addComponent(label3).addComponent(text3)); 
    vGroup.addGroup(layout.createParallelGroup(BASELINE).addComponent(label4).addComponent(text4)); 
    vGroup.addGroup(layout.createParallelGroup(BASELINE).addComponent(label5).addComponent(text5)); 
    layout.setVerticalGroup(vGroup); 

    return(p); 
} 

public void actionPerformed(ActionEvent e) 
{ 
    if(e.getActionCommand().equals("SAVE")) 
    { 
     System.out.println("SAVED"); 
     dispose(); 
    } 
    else if(e.getActionCommand().equals("CANCEL")) 
    { 
     System.out.println("CANCELED"); 
     dispose(); 
    } 
    else if(e.getActionCommand().equals("SAVE AND NEW")) 
    { 
     System.out.println("SAVED AND NEW"); 
    } 
} 
} 

class WorkOrder 
{ 
String name; 
int department; 
Object dateRequested; 
Object dateFulfilled; 
String description; 
double billingRate; 
} 

class NameVerifier extends InputVerifier 
{ 
public boolean verify(JComponent input) 
{ 
    String str; 
    boolean isValid; 
    int score; 

    str = ((JTextField)input).getText().trim(); 

    if(str.equals("")) 
    { 
     isValid = false; 
     JOptionPane.showMessageDialog(input.getParent(), "Name field is blank.", "ERROR", JOptionPane.ERROR_MESSAGE); 
    } 
    else 
    { 
     isValid = true; 
    } 

    return(isValid); 
} 
} 

回答

0

的問題是,如果我離開領域的空白,我選項卡下一個領域,錯誤信息彈出。

請勿使用InputVerifier。 InputVerifier的目的是在失去焦點時驗證文本字段。

我想使所有空白字段都有效,直到用戶單擊SAVE。

將您的驗證邏輯(對於所有字段)添加到「保存」按鈕的ActionListener。

因此,您可以在每個文本字段上使用InputVerifier來驗證輸入數據的格式(輸入數據時)。例如,對於「帳單費率」,您可以驗證該值是雙數,日期字段包含有效日期。

然後在「保存」偵聽器中驗證所有字段都包含數據。因此,如果數據的格式是有效的,並且所有字段都包含數據,那麼您知道論壇可以提交處理。

+0

這很有道理,但這實際上是一個我正在上課的項目,我被告知要使用InputVerifier – BCRwar3

+0

@ BCRwar3,閱讀我的編輯。 '我想這樣做以便所有空白字段都有效,直到用戶單擊SAVE' - 所以InputVerifier什麼也不做,這個字段是空白的。這是驗證總是如何完成的。這是一個兩步過程。第一步是使用有效格式(在這種情況下使用InputVerifier),第二步是確保所有字段都輸入了數據。 – camickr

+0

謝謝,我現在得到它! – BCRwar3

相關問題