非法转发引用netbeans swing



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

}

和我不能得到文本字段的文本在字符串变量

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


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

解决方案:初始化你的字符串与空字符串,"",然后在某种事件,也许是一个ActionListener,用户调用他已经填满了文本字段的文本,给你的名字变量由JTextField持有的文本。

编辑2:谢谢你改进你的问题!

编辑3
你在注释中声明:

但是仍然有一个概念上的问题,说当我按下"进入"按钮在我的gui页面(没有在文本字段中写任何东西),检查函数被调用(在我的程序中),并在if语句getText工作?(所以仍然没有写在文本字段和jTextField1也没有被声明!)

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


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

相关内容

  • 没有找到相关文章

最新更新