3

我正在尝试创建类似于 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
4

1 回答 1

8

同样,为什么不使用 JOptionPane?许多人误解了这些有用的结构,认为它们只能用于最简单的 gui,而事实并非如此。使用这些以获得最大功能的关键是要了解大多数 JOptionPane 方法中的第二个参数是Object,并且这个 Object 可以是一个非常复杂的甚至是一个包含其他组件的大型 JPanel,包括其他 JPanel、JTables、JComboBoxes 等。 . 我用它来向用户展示复杂的模态输入对话框,就像你想要做的一样。然后,当 JOptionPane 被处理并且程序流程返回到您的程序时,您查询显示在 JOptionPane 中的复杂 GUI 的属性并提取其信息。再次,请在此处查看我的链接,看看我的意思。

例如,对于您的情况,如果您想要一个包含 3 个 JTextField 的 JPanel 来获取您的 b 编号、名字和姓氏信息,只需创建一个包含 JTextField 及其相应 JLabel 的 JPanel:

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();
         }
      });
   }
}
于 2012-04-14T01:42:46.220 回答