Java 从jButton获取文本值

Java 从jButton获取文本值,java,swing,user-interface,jbutton,Java,Swing,User Interface,Jbutton,因此,我需要简单地检查单击按钮的文本是“X”还是“O”(使tic-tac-toe) 此代码不起作用: if (jButton1.getText()=="X") 但是,以下代码不起作用: String jButText = jButton1.getText(); if (jButText=="X") 为什么第一位代码不工作,而第二位代码工作?它是否需要更像if(jButton1.getText().toString==“X”)呢?顺便说一下,我认为Java中不存在toString。这在某种程度

因此,我需要简单地检查单击按钮的文本是
“X”
还是
“O”
(使tic-tac-toe) 此代码不起作用:

if (jButton1.getText()=="X")
但是,以下代码不起作用:

String jButText = jButton1.getText();
if (jButText=="X")

为什么第一位代码不工作,而第二位代码工作?它是否需要更像if(
jButton1.getText().toString==“X”
)呢?顺便说一下,我认为Java中不存在
toString
。这在某种程度上与我通常用于创建GUI的Visual Basic相当。

这种行为在java 1.7.0_45或1.7.0_25中是不可复制的,对于您的java版本来说,这可能是一种奇怪的情况

为了使代码在所有java版本上正常工作,必须使用
equals()

=
比较对象,同时
.equals()
比较字符串对象的内容

jButton1.getText().equals("X")

这种行为在java 1.7.0_45或1.7.0_25中是不可复制的,对于您的java版本来说,这可能是一种奇怪的情况

为了使代码在所有java版本上正常工作,必须使用
equals()

=
比较对象,同时
.equals()
比较字符串对象的内容

jButton1.getText().equals("X")

在java中,当您使用==比较字符串时,您正在比较它们的内存地址,以检查两个字符串是否包含您应该调用的相同文本。equals()


在java中,当您使用==比较字符串时,您正在比较它们的内存地址,以检查两个字符串是否包含您应该调用的相同文本。equals()


使用AWT按钮类时,这也让我抓狂。。。答案是:按钮没有.getText()方法。。。您需要使用.getLabel()


现在,JButtons的故事是:根据您的java版本,getLabel()被弃用,最后被getText取代。。。名称空间不是很棒吗?

使用AWT Button类时,这也让我抓狂。。。答案是:按钮没有.getText()方法。。。您需要使用.getLabel()

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyFrame extends JFrame{
    JButton equalsButton;
    JLabel ansLabel;
    JLabel addLabel;
    JTextField text1;
    JTextField text2;

    MyFrame (){
        setSize(300,300); 
        setDefaultCloseOperation(3);
        setLayout(new FlowLayout());
        text1=new JTextField(10);
        add(text1);
        addLabel=new JLabel("+");
        add(addLabel);
        text2=new JTextField(10);
        add(text2);     
        equalsButton=new JButton("=");
        equalsButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                int num1=Integer.parseInt(text1.getText());
                int num2=Integer.parseInt(text2.getText());
                int tot=num1+num2;
                ansLabel.setText(Integer.toString(tot));
            }
        });
        add(equalsButton);
        ansLabel=new JLabel("    "); 
        add(ansLabel);
        pack();
        setVisible(true);
    }
}

class Demo{
    public static void main(String args[]){
        MyFrame f1=new MyFrame();

    }
}


现在,JButtons的故事是:根据您的java版本,getLabel()被弃用,最后被getText取代。。。名称空间不是很棒吗?

equals(“X”)and not==“X”这不是一个重复的字符串比较问题,每天都会被问几次。这里的问题是为什么第二个代码段有效,而第一个代码段无效。如果第二个片段确实有效,而不是第一个片段,那么我不知道答案。我希望它们生成相同的字节码。toString()确实存在于java中,但是getText()已经返回了一个字符串,因此在它上运行toString()没有多大意义。您使用的是哪一版本的java?这在java 1.7.0_45中是不可复制的。equals(“X”)和not==“X”这不是每天多次被询问的同一个字符串比较问题的重复。这里的问题是为什么第二个代码段有效,而第一个代码段无效。如果第二个片段确实有效,而不是第一个片段,那么我不知道答案。我希望它们生成相同的字节码。toString()确实存在于java中,但是getText()已经返回了一个字符串,因此在它上运行toString()没有多大意义。您使用的是哪一版本的java?这在java 1.7.045中是不可复制的。在最后一种情况下,您不会得到NullPointerException,因为getText()将返回一个空字符串。这并不能回答问题。请看我在问题下的评论。你是rigth@spydon,我错了。)在最后一种情况下,您不会得到NullPointerException,因为getText()将返回一个空字符串。这并不能回答问题。请看我在问题下的评论。你是rigth@spydon,我错了。)实习也是我首先想到的,但这并不能解释为什么第一个条件不起作用。如果“X”是intern,那么无论是否将其分配给变量,getText都会返回“X”。这是因为
jButton1.setText()
显式创建了一个新的字符串对象,用于该比较。我不确定。OP没有说他/她编写了
新字符串(jButton1.getText())
,所以这似乎不适用。这当然不能解释为什么OP的两个原始代码片段的行为不同。我诚实的怀疑是OP在理解他/她的结果时犯了一个错误。如果
setText
创建了一个新的
String
对象,那么这仍然不能解释第二个代码段工作的原因。嗯,你是对的,我检查了AbstractButton的源代码,它不会在setText()上创建一个新的String对象它只做
stringoldvalue=this.text;this.text=文本
和getText()只返回文本。实习也是我首先想到的,但它没有解释为什么第一个条件不起作用。如果“X”是intern,那么无论是否将其分配给变量,getText都会返回“X”。这是因为
jButton1.setText()
显式创建了一个新的字符串对象,用于该比较。我不确定。OP没有说他/她编写了
新字符串(jButton1.getText())
,所以这似乎不适用。这当然不能解释为什么OP的两个原始代码片段的行为不同。我诚实的怀疑是OP在理解他/她的结果时犯了一个错误。如果
setText
创建了一个新的
String
对象,那么这仍然不能解释第二个代码段工作的原因。嗯,你是对的,我检查了AbstractButton的源代码,它不会在setText()上创建一个新的String对象它只做
stringoldvalue=this.text;this.text=文本
和getText()仅返回文本。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyFrame extends JFrame{
    JButton equalsButton;
    JLabel ansLabel;
    JLabel addLabel;
    JTextField text1;
    JTextField text2;

    MyFrame (){
        setSize(300,300); 
        setDefaultCloseOperation(3);
        setLayout(new FlowLayout());
        text1=new JTextField(10);
        add(text1);
        addLabel=new JLabel("+");
        add(addLabel);
        text2=new JTextField(10);
        add(text2);     
        equalsButton=new JButton("=");
        equalsButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                int num1=Integer.parseInt(text1.getText());
                int num2=Integer.parseInt(text2.getText());
                int tot=num1+num2;
                ansLabel.setText(Integer.toString(tot));
            }
        });
        add(equalsButton);
        ansLabel=new JLabel("    "); 
        add(ansLabel);
        pack();
        setVisible(true);
    }
}

class Demo{
    public static void main(String args[]){
        MyFrame f1=new MyFrame();

    }
}