我正在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持有的文本。
编辑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()) {
// ....