проблема с получением информации о переменной из другого JFrame

Я пытаюсь создать что-то похожее на JOptionPane, но получаю более одной (3) переменных из ввода. Поэтому я решил использовать отдельный JFrame с тремя текстовыми полями. Я использовал такие методы доступа, как Get и Set, чтобы получить переменные из одного класса в другой, но я получаю исключение нулевого указателя. Я полагаю, что неправильно получаю переменные, и мне трудно найти жизнеспособное решение.

public class Instructor()
{
public void Insert(JPanel panel)
{
panel.removeAll();
panel.updateUI();
//ResultSet resultSet = null;
    String bNum = "";
String fName = "";  
String lName = "";


    InsertFrame insert = new InsertFrame();
    insert.setVisible(true);
    bNum = insert.getBNumber();
fName = insert.getFirstName();  
lName = insert.getLastName();

    /*
    String bNum = JOptionPane.showInputDialog("Enter BNumber");
    String fName = JOptionPane.showInputDialog("Enter First Name");
    String lName = JOptionPane.showInputDialog("Enter Last Name");*/
try
{
    connection = DriverManager.getConnection(URL);
    insertNewInstructor = connection.prepareStatement(
    "INSERT INTO Instructor" + "(BNumber, FirstName, LastName)" + "VALUES           (?,?,?)");
}catch(SQLException sqlException){
    sqlException.printStackTrace();
    System.exit(1);
}//end catch


try
{
    insertNewInstructor.setString(1, bNum);
    insertNewInstructor.setString(2, fName);
    insertNewInstructor.setString(3, lName);
    insertNewInstructor.executeUpdate();
}catch(SQLException sqlException){
        sqlException.printStackTrace();
}//end of catch
finally
{
    close();
}//end 

Display(panel);

 }//end of insert method
 }//end of class Instructor

class InsertFrame extends JFrame implements ActionListener
{

private JTextField bNumber;
private JLabel bNum;
private JTextField firstName;
private JLabel fName;
private JTextField lastName;
private JLabel lName;
private JButton ok;
private JPanel fieldPanel;
    private JPanel buttonPanel;
    private String bNumr = "";
    private String frName = "";
    private String lsName = "";

public InsertFrame()
{
bNumber = new JTextField(10);
bNum = new JLabel();
firstName = new JTextField(10);
fName = new JLabel();
lastName = new JTextField(10);
lName = new JLabel();

fieldPanel = new JPanel();
fieldPanel.setLayout(new GridLayout(3,2,4,4));
bNum.setText("B-Number:");
fieldPanel.add(bNum);
fieldPanel.add(bNumber);
fName.setText("First Name:");
fieldPanel.add(fName);
fieldPanel.add(firstName);
lName.setText("Last Name:");
fieldPanel.add(lName);
fieldPanel.add(lastName);
    ok = new JButton("Ok");
    ok.addActionListener(this);

this.add(fieldPanel, BorderLayout.CENTER);
this.add(buttonPanel,BorderLayout.SOUTH);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(310,300);
this.setResizable(false);
this.setVisible(false);
}//end of constructor
public void actionPerformed(ActionEvent e)
{
bNumr = bNumber.getText();
frName = firstName.getText();
lsName = lastName.getText();
}//end of method actionPerformed

public void setBNumber(String number)
{
bNumr = number;
}//end of setBNumber
public String getBNumber()
{
return bNumr;
}//end of getBNumber method
public void setFirstName(String firstN)
{
frName = firstN;
}//end of setFirstName
public String getFirstName()
{
return frName;
}//end of getFirstName method
public void setLastName(String lastN)
{
lsName = lastN;
}//end of setLastName method
public String getLastName()
{
return lsName;
}//end of getLastName method
}//end of InsertFrame

person Itchy Nekotorych    schedule 14.04.2012    source источник
comment
Почему бы не использовать JOptionPane, а просто дать ему 3 JTextFields? Посмотрите, например, это.   -  person Hovercraft Full Of Eels    schedule 14.04.2012


Ответы (1)


Опять же, почему бы не использовать JOptionPane? Многие люди неправильно понимают эти полезные конструкции, думая, что их можно использовать только для самых простых графических интерфейсов, когда нет ничего более далекого от истины. Ключом к их использованию для достижения максимальной мощности является понимание того, что вторым параметром в большинстве методов JOptionPane является Object, и что этот объект может быть очень сложным и даже большим JPanel, который содержит другие компоненты, включая другие JPanels, JTables, JComboBoxes и т. д. .. Я использовал это, чтобы представить пользователю сложные модальные диалоги ввода, очень похожие на то, что вы пытаетесь сделать. Затем, когда JOptionPane обработан и поток программы возвращается к вашей программе, вы запрашиваете свойства сложного графического интерфейса, который отображался в JOptionPane, и извлекаете его информацию. Опять же, проверьте мою ссылку здесь, чтобы точно понять, что я имею в виду.

Например, для вашей ситуации, если вы хотите, чтобы JPanel, содержащая 3 JTextFields, получала информацию о вашем b-номере, имени и фамилии, просто создайте JPanel, которая содержит JTextFields и соответствующие им JLabels:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.HashMap;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class PlayerEditorPanel extends JPanel {
   enum FieldTitle {
      B_NUMBER("B Number"), FIRST_NAME("First Name"), LAST_NAME("Last Name");
      private String title;

      private FieldTitle(String title) {
         this.title = title;
      }

      public String getTitle() {
         return title;
      }
   };

   private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5);
   private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0);
   private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>();

   public PlayerEditorPanel() {
      setLayout(new GridBagLayout());
      setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("Player Editor"),
            BorderFactory.createEmptyBorder(5, 5, 5, 5)));
      GridBagConstraints gbc;
      for (int i = 0; i < FieldTitle.values().length; i++) {
         FieldTitle fieldTitle = FieldTitle.values()[i];
         gbc = createGbc(0, i);
         add(new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT), gbc);
         gbc = createGbc(1, i);
         JTextField textField = new JTextField(10);
         add(textField, gbc);

         fieldMap.put(fieldTitle, textField);
      }
   }

   private GridBagConstraints createGbc(int x, int y) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;

      gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
      gbc.fill = (x == 0) ? GridBagConstraints.BOTH
            : GridBagConstraints.HORIZONTAL;

      gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
      gbc.weightx = (x == 0) ? 0.1 : 1.0;
      gbc.weighty = 1.0;
      return gbc;
   }

   public String getFieldText(FieldTitle fieldTitle) {
      return fieldMap.get(fieldTitle).getText();
   }

}

Затем покажите это в JOptionPane следующим образом:

PlayerEditorPanel playerEditorPanel = new PlayerEditorPanel();


int result = JOptionPane.showConfirmDialog(null, playerEditorPanel,
    "Edit Player JOptionPane", JOptionPane.OK_CANCEL_OPTION,
    JOptionPane.PLAIN_MESSAGE);

а затем извлеките необходимую информацию из JPanel:

        if (result == JOptionPane.OK_OPTION) {
           for (PlayerEditorPanel.FieldTitle fieldTitle : PlayerEditorPanel.FieldTitle
                 .values()) {
              textArea.append(String.format("%10s: %s%n",
                    fieldTitle.getTitle(),
                    playerEditorPanel.getFieldText(fieldTitle)));
           }
        }

Основной класс может выглядеть так:

import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

@SuppressWarnings("serial")
public class ComplexOptionPane extends JPanel {
   private PlayerEditorPanel playerEditorPanel = new PlayerEditorPanel();
   private JTextArea textArea = new JTextArea(12, 30);

   public ComplexOptionPane() {
      textArea.setEditable(false);
      textArea.setFocusable(false);
      textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 16));
      JPanel bottomPanel = new JPanel();
      bottomPanel.add(new JButton(new AbstractAction("Get Player Information") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            int result = JOptionPane.showConfirmDialog(null, playerEditorPanel,
                  "Edit Player JOptionPane", JOptionPane.OK_CANCEL_OPTION,
                  JOptionPane.PLAIN_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
               for (PlayerEditorPanel.FieldTitle fieldTitle : PlayerEditorPanel.FieldTitle
                     .values()) {
                  textArea.append(String.format("%10s: %s%n",
                        fieldTitle.getTitle(),
                        playerEditorPanel.getFieldText(fieldTitle)));
               }
            }
         }
      }));
      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      setLayout(new BorderLayout(5, 5));
      add(new JScrollPane(textArea), BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
   }

   private static void createAndShowGui() {
      ComplexOptionPane mainPanel = new ComplexOptionPane();

      JFrame frame = new JFrame("ComplexOptionPane");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 14.04.2012