非法前瞻性参考netbeans摇摆

时间:2014-07-19 22:23:14

标签: java swing netbeans

我正在构建一个带有netbeans swing的GUI。在设计GUI时,netbeans实例化程序末尾的所有变量,这些变量无法操作。现在我想获取Jtextfield数据并将其放在String对象中。假设netbeans将我的JTextField变量创建为jTextField1,如果我这样做

开始时

String name=jTextField1.getText()

它显示了非法前向引用的错误,如果我尝试在程序结束时定义它(在所有netbeans的声明之后),它会抛出数百万个异常。

那么我应该怎么做才能声明这个字符串对象并在变量中检索gettext()的值?

编辑:

//代码

import javax.swing.JOptionPane;



public class LoginInternalFrame extends javax.swing.JInternalFrame

{



public LoginInternalFrame() 
{
    initComponents();
}


public int check()
{
    if(jTextField1.getText().equals(""))
    {
        return 0;

    }
    if(jPasswordField1.getText().equals(""))
    {
        return 0;

    }

       return 1;     
}

//HERE I AM TRYING TO DECLARE ********************

 String user = jTextField1.getText();

//THIS IS SHOWING ILLEGAL FORWARD REFERENCE BECAUSE jTextField IS DECLARED AT THE END OF THE CODE WHICH IS UNMODIFIABLE IN THE IDE



//HERE STARTS NETBEANS' GENERATED CODE 

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jTextField1 = new javax.swing.JTextField();
    jPasswordField1 = new javax.swing.JPasswordField();
    jButton1 = new javax.swing.JButton();

    setClosable(true);
    setIconifiable(true);
    setMaximizable(true);
    setResizable(true);

    jLabel1.setFont(new java.awt.Font("Tekton Pro", 0, 18)); // NOI18N
    jLabel1.setText("Username");

    jLabel2.setFont(new java.awt.Font("Tekton Pro Ext", 0, 18)); // NOI18N
    jLabel2.setText("Password");

    jTextField1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jTextField1ActionPerformed(evt);
        }
    });

    jButton1.setFont(new java.awt.Font("Tarzan", 1, 18)); // NOI18N
    jButton1.setText("Login");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(213, 213, 213)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(127, 127, 127)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(0, 245, Short.MAX_VALUE))
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(351, 351, 351))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(93, 93, 93)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(49, 49, 49)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(84, 84, 84)
            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(145, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold> 

//NETBEANS' GENERATED CODE ENDS.

//THE ACTIOINPERFORMED METHODS

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    if(check()==0)
        {
            JOptionPane.showMessageDialog(this, "All Fields are Required...","Error",JOptionPane.ERROR_MESSAGE);
            return;
        }
    WelcomeUser ww=new WelcomeUser();
     ww.setVisible(true);
     this.setVisible(false);

}                                        

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            

}                                           

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPasswordField jPasswordField1;
private javax.swing.JTextField jTextField1;
// End of variables declaration                   

//THESE ARE THE UNMODIFIABLE DECLARATIONS IN THE END.NOW WHEN I TRY DECLARE STRING HERE ,THE IDE SHOWS A LOT OF EXCEPTIONS.

}

我无法在字符串变量中获取textfield的文本。

1 个答案:

答案 0 :(得分:3)

我的猜测是,在任何构造函数或方法之外,您在代码的初始化部分中声明了名称String,因此在声明jtf JTextField之前。如果是这样,解决方案是,是的,好的,在这个区域声明名称,但不要尝试用JTextField的文本初始化它。


编辑:是的,我是对的 - 你在任何构造函数或方法之外声明用户变量,这很好,但你也试图用JTextField jTextField1的文本初始化它,这没有意义。不仅声明了文本字段变量,而且即使它已被声明,它甚至还没有被构造。即使它被构造,它也不会保留任何有用的文本,因为用户还没有机会用文本填充它。

解决方案:使用空字符串""初始化String,然后在某种事件中,也许是用户在之后调用的ActionListener,用文本填充文本字段,将您的名称变量赋予您的JTextField所持有的文本。

编辑2:感谢您提出改进的问题!


编辑3
您在评论中说明:

  

但是当我在我的gui页面上按“enter”按钮时(在文本字段中没有写任何内容),仍然存在一个概念性问题,检查函数被调用(在我的程序中)并且在if语句中有getText有效吗?(因此在文本字段中没有任何内容写入,jTextField1还没有被声明!)

实际上是,它现在已经被声明,现在可能在其中有文本(如果用户在输入文本后按Enter键)。在代码中以地理位置访问变量并不重要,除非您在相同的范围级别内,而是在逻辑的位置访问它。由于您是从非静态方法访问它,并且因为您的JTextField变量是在类的声明部分中声明的,所以编译器知道它已经被声明了。


编辑4
一个关键的概念是理解哪些对象可以做什么和不可以做什么,并且字符串是不可变的 - 不能改变。请注意,如果允许您的初始声明,它仍然没有用,因为当JTextField的文本发生更改时,您的名称变量不会。改变它的唯一方法是在需要时,在事件发生时分配一个新的String(可能是JTextField中的新String)。 Java中没有任何魔力。

另外关于你的check()方法,因为它返回二进制结果,为什么不让它返回boolean。此外,您不应该在JPasswordField上调用getText(),因为它会暴露密码文本,从而大大降低程序的安全性。我会做类似的事情:

//!! make this boolean
public boolean check() {
  if (jTextField1.getText().trim().isEmpty()) {
     return false;
  }
  if (jPasswordField1.getPassword().length == 0) {
     return false;
  }
  return true;
}

然后像这样调用它:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
   if (check()) {
      // ....