当前位置: 首页 > 面试题库 >

无法从另一个JFrame获取变量信息

宋涵忍
2023-03-14
问题内容

我正在尝试创建类似于JOptionPane的内容,但将从输入中获取多个(3)变量。所以我想我将使用一个具有三个textField的单独的JFrame。我使用了诸如Get和Set之类的访问方法来将变量从一个类获取到另一个类,但是我得到了html" target="_blank">空指针。我认为我将以错误的方式获取变量,并且很难找到可行的解决方案。

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

问题答案:

同样,为什么不使用JOptionPane?许多人误解了这些有用的结构,以为只有在最真实的情况下才可以将它们用于最简单的GUI。使用这些方法以获得最大功效的关键是要了解大多数JOptionPane方法中的第二个参数是Object,并且此Object可能是非常复杂的,甚至是一个大型的JPanel,它包含其他组件,包括其他JPanels,JTables,JComboBoxes等。我已经使用它向用户展示了复杂的模态输入对话框,就像您要尝试的那样。然后,在处理完JOptionPane并返回程序后,您将查询JOptionPane中显示的复杂GUI的属性并提取其信息。同样,请在此处查看我的链接,确切地了解我的意思。

例如,根据您的情况,如果您想要一个包含3个JTextField的JPanel来获取您的b-
数字,名字和姓氏信息,只需创建一个包含JTextFields及其对应的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();
         }
      });
   }
}


 类似资料:
  • 问题内容: 所以我想知道当在多个php文件中使用变量名时,是否有可能从特定的php文件中获取变量。一个例子是这样的: page1.php有 page2.php有 footer.php应该有 好的,这个例子有点抽象,但是就我所能讲的那么短。我想你明白我的意思!这就是我追求的页脚!有什么解决办法吗? 问题答案: 您可以,但是最后一个include中的变量将覆盖第一个中的变量: myfile.php m

  • 问题内容: 我有两个 newAccessLevels.java ,它有两个按钮“ Level 1”,“ Level 2”和 newAccessPanel.java。 我需要获取用户选择“ 1或2”的级别,以便可以在标题中显示它。 accessPanel.java, 例如访问级别1,访问级别2。如何完成此操作。下面是示例代码,因此,如果单击级别1,则将打开标题为* ACCESS LEVEL 1 的n

  • 我是个新手,所以请对我放松点:D 我在解决这个问题时遇到了一些问题,因为我的数据存储在一个数组中,我需要一种方法,能够将相同的数据放入一个变量中,因为我需要做一些运算来获得平均分数,我尝试做的第一件事是制作一个变量,并将数组作为值,但它不允许我做任何事情,我已经花了很多时间在它上面,我仍然不想知道如何修复它,所以如果你能帮我解决这个问题。 总结一下,我要做的是得到我存储在i中的学生数量和应该在数组

  • 问题内容: 我知道这是我的错误。我的问题是,为什么这不起作用,我想念的是什么,我可以称其为方法而不是类,因此我假设他们的第三类有问题吗? 第1类: } 第2类: 第3类,这是我不能在jframe上使用的绘画: } 问题答案: 您的问题是您滥用继承。您的JVMDiagram正在扩展JVMComponent,但不应该。是的,您获得了JVMComponent的getWidth()和getHeight()

  • 问题内容: 如何从另一个类中处置JFrame?我的代码在下面列出。我使用Netbeans生成表单来生成窗口。我想使用另一个类进行处理(名称为needDispose)。 NETBEANS GENERATE (重要方法是getMainFrame()) 问题答案: 这是一个如何从另一个本身就是JFrame的类中释放JFrame的示例: