我正在构建一个带有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的文本。
答案 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()) {
// ....