Как сделать пустые поля действительными, пока пользователь не нажмет СОХРАНИТЬ -Java

Это простая программа, которая использует JDialog для добавления или редактирования рабочих заданий. Когда появится диалоговое окно, пользователь введет информацию в поля (имя, дата, должность, тариф и т.д.). Программа должна проверить каждое из этих полей. Проблема в том, что если я оставлю поле пустым и перейду к следующему полю, появится сообщение об ошибке. На самом деле, это не проблема, все работает как надо, однако я хотел бы сделать так, чтобы все пустые поля были действительны до тех пор, пока пользователь не нажмет кнопку СОХРАНИТЬ. Любые предложения или идеи? Я вставил всю программу ниже, поэтому не стесняйтесь скомпилировать и запустить ее самостоятельно, спасибо!

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

person BCRwar3    schedule 17.10.2015    source источник


Ответы (1)


Проблема в том, что если я оставлю поле пустым и перейду к следующему полю, появится сообщение об ошибке.

Не используйте InputVerifier. Целью InputVerifier является проверка текстового поля, когда оно теряет фокус.

Я хотел бы сделать так, чтобы все пустые поля были действительны, пока пользователь не нажмет СОХРАНИТЬ.

Добавьте свою логику проверки (для всех полей) в ActionListener кнопки «Сохранить».

Таким образом, вы должны использовать InputVerifier в каждом текстовом поле для проверки формата введенных данных (когда данные вводятся). Например, для «ставки выставления счетов» вы должны убедиться, что значение представляет собой двойное число, а поля даты содержат допустимую дату.

Затем в прослушивателе «Сохранить» вы подтверждаете, что все поля содержат данные. Таким образом, если данные в допустимом формате и все поля содержат данные, вы знаете, что форум может быть отправлен на обработку.

person camickr    schedule 17.10.2015
comment
Это имеет смысл, однако на самом деле это проект для класса, который я беру, и мне сказали использовать InputVerifier - person BCRwar3; 17.10.2015
comment
@BCRwar3, прочитай мою правку. I would like to make it so that all blank fields are valid until the user clicks SAVE - поэтому InputVerifier ничего не делает, если поле пустое. Так всегда делается проверка. это двухэтапный процесс. Первый шаг — проверка допустимого формата (в этом случае вы используете InputVerifier), второй шаг — убедиться, что во все поля введены данные. - person camickr; 17.10.2015
comment
Спасибо, теперь я понял! - person BCRwar3; 17.10.2015