2012-04-14 19 views
3

Ich versuche, etwas Ähnliches wie ein JOptionPane zu erstellen, erhalte aber mehr als eine (3) Variable aus der Eingabe. Also dachte ich, ich würde einen separaten JFrame verwenden, der drei textFields hat. Ich habe Zugriffsmethoden wie Get und Set verwendet, um die Variablen von einer Klasse zur anderen zu bekommen, aber ich bekomme eine Null-Zeiger-Exception. Ich gehe davon aus, dass ich die Variablen falsch hinbekomme und es schwer finde, eine brauchbare Lösung zu finden.Problem beim Abrufen von Variableninformationen von einem anderen JFrame

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 
+0

Warum noch kein JOptionPane verwenden, aber es nur 3 JTextFields geben? Sehen Sie sich zum Beispiel [this] (http://stackoverflow.com/a/9952457/522444) an. –

Antwort

8

Wieder, warum nicht einen JOptionPane benutzen? Viele Menschen missverstehen diese nützlichen Konstrukte und denken, dass sie nur für die einfachsten Gui verwendet werden können, wenn nichts weiter von der Wahrheit entfernt ist. Der Schlüssel bei der Verwendung dieser für maximale Leistung besteht darin zu verstehen, dass der zweite Parameter in den meisten JOptionPane-Methoden Object ist und dass dieses Objekt ein sehr komplexes und sogar ein großes JPanel sein kann, das andere Komponenten einschließlich anderer JPanels, JTables, JComboBoxes usw. enthält. .. Ich habe dies verwendet, um komplexe modale Eingabedialoge für den Benutzer darzustellen, ähnlich wie Sie es versuchen. Wenn dann das JOptionPane bearbeitet wurde und der Programmablauf in Ihr Programm zurückkehrt, fragen Sie die Eigenschaften der komplexen GUI ab, die im JOptionPane angezeigt wurde, und extrahieren Sie deren Informationen. Schauen Sie sich nochmal meinen Link here an, um genau zu sehen, was ich meine.

Zum Beispiel für Ihre Situation, wenn Sie einen JPanel wollten, 3 JTextFields gehalten Ihre b-Nummer, Vorname und Nachname Informationen zu erhalten, erstellen Sie einfach eine JPanel, die die JTextFields und ihre entsprechenden JLabels hält:

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

} 

zeigen dann ist es in einem JOptionPane etwa so:

PlayerEditorPanel playerEditorPanel = new PlayerEditorPanel(); 


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

und dann die notwendigen Informationen aus dem JPanel extrahieren:

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

könnte Die Hauptklasse wie folgt aussehen:

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(); 
     } 
     }); 
    } 
} 
+0

wow, danke. –

+0

@Shane: Gern geschehen –

Verwandte Themen