【问题标题】:illegal forward reference netbeans swing非法前向参考 netbeans swing
【发布时间】:2014-07-19 22:23:14
【问题描述】:

我正在用 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.

}

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

【问题讨论】:

  • 请显示更多相关代码。你的“一开始”到底是什么意思?在构造函数中?在构造函数之前?如果在构造函数中,在您的 initComponents() 方法被调用之前?我质疑您为什么要在课程开始之前在用户有机会在文本字段中输入信息之前致电getText()

标签: java swing netbeans


【解决方案1】:

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


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

解决方案:使用空字符串 "" 初始化您的字符串,然后在某种事件中,可能是用户在 用文本填充文本字段后调用的 ActionListener,给出你的名字变量你的 JTextField 保存的文本。

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


编辑 3
您在评论中声明:

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

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


编辑 4
一个关键概念是了解对象可以做什么和不能做什么,以及字符串是不可变的——不能更改。请注意,如果您的初始声明被允许,它仍然没有帮助,因为当 JTextField 的文本更改时,您的 name 变量不会。更改它的唯一方法是在发生事件时在需要时分配一个新字符串(可能是 JTextField 中的新字符串)。 Java 没有魔法。

另外,关于您的 check() 方法,既然它返回二进制结果,为什么不让它返回布尔值。此外,您不应在 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()) {
      // ....

【讨论】:

  • 谢谢。有效。但是仍然存在一个概念性问题,即当我在我的 gui 页面上按下“输入”按钮时(没有在文本字段中写入任何内容),检查函数被调用(在我的程序中)并且在 if 语句中 getText 有效?(所以文本字段中仍然没有任何内容,并且 jTextField1 也尚未声明!)
  • 将进行更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2011-01-08
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多