setText("")和setText(null)为什么清除不了文本,但是把setText(“s”)能使文本框置为s

qq_35973091 2016-11-19 10:17:34
import java.awt.*;
import java.awt.event.*;
public class AText extends Frame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private TextField text1;
private Button button;
public AText()
{ super("清楚文本框");
setBounds(600,440,600,200);
setBackground(Color.lightGray);
setLayout(new FlowLayout(FlowLayout.LEFT));
text1 = new TextField(20);
add(text1);
button = new Button("清楚");
add(button);
button.addActionListener(this);
this.addWindowListener(new WinClose());
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{ //String t="";
if (e.getSource()==button) //获得当前事件源
text1.setText(""); //清除文本框
} public static void main(String arg[]){
new AText();
}
}
class WinClose extends WindowAdapter
{public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
...全文
880 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
EarthMercy 2016-11-20
  • 打赏
  • 举报
回复
学习了。。。 很深入。
nmyangym 2016-11-20
  • 打赏
  • 举报
回复 1
个人浅见,欢迎指正。 TextField 继承自TextComponet, 在这里定义了一个字符串变量text, 对应文本框内容。

/**
     * The value of the text.
     * A <code>null</code> value is the same as "".
     *
     * @serial
     * @see #setText(String)
     * @see #getText()
     */
    String text;
这里,text 没赋值,就是 text =null; 看赋值语句,setText(String t),源码是这样的:
    /**
     * Sets the text that is presented by this
     * text component to be the specified text.
     * @param       t   the new text;
     *                  if this parameter is <code>null</code> then
     *                  the text is set to the empty string ""
     * @see         java.awt.TextComponent#getText
     */
    public synchronized void setText(String t) {
        boolean skipTextEvent = (text == null || text.isEmpty())
                && (t == null || t.isEmpty());
        text = (t != null) ? t : "";
        TextComponentPeer peer = (TextComponentPeer)this.peer;
        // Please note that we do not want to post an event
        // if TextArea.setText() or TextField.setText() replaces an empty text
        // by an empty text, that is, if component's text remains unchanged.
        if (peer != null && !skipTextEvent) {
            peer.setText(text);
        }
    }
我们看见,如果text 是null, t 是"", skipTextEvent 是true, peer.setText(text);不执行。 问题关键是,我们在文本框里输入内容了,text是否改变了?测试是没有改变还是null,也就是说只是给文本框里输入内容,底层的text并没改变. 所以就会出现楼主看到的情况。 如果要想达到清除的目的,可以先使用getText(), 读一下文本框内容,在getText()代码里,text被赋值了。

    /**
     * Returns the text that is presented by this text component.
     * By default, this is an empty string.
     *
     * @return the value of this <code>TextComponent</code>
     * @see     java.awt.TextComponent#setText
     */
    public synchronized String getText() {
        TextComponentPeer peer = (TextComponentPeer)this.peer;
        if (peer != null) {
            text = peer.getText();//--------------------------------------看这句。
        }
        return text;
    }
所以,楼主代码加一句,text1.getText(), 就会清除掉文本框内容了。
public void actionPerformed(ActionEvent e) 
{ //String t="";
        if (e.getSource()==button){                                //获得当前事件源 
              text1.getText();
              text1.setText("");                                             //清除文本框
        }
}
baidu_35198066 2016-11-19
  • 打赏
  • 举报
回复
这好像是一个BUG,我写的计算器也是这样,不知道为啥。 楼主知道了跟我说一声
3gp视频的分割格式转换视频的分割 import java.awt.Dimension; import java.awt.Frame; import java.awt.Rectangle; import javax.swing.JDialog; import javax.swing.JTextField; public class About extends JDialog { public About(Frame owner, String title, boolean modal) { // 构造方法 super(owner, title, modal); // 继承 this.setLocationRelativeTo(this); this.setSize(240, 260); // 设大小 this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 关闭处理 initUI(); } private void initUI() { this.getContentPane().setLayout(null); jTextField1.setText("我们的口号: 只有想不到,没有做不到"); // 加入文本内容 jTextField1.setEditable(false); jTextField1.setBounds(new Rectangle(1, 29, 239, 41)); // 设大小 jTextField2.setText("本组成员: 王榆升(组长) 曾佳林 钱彦"); // 加入文本内容 jTextField2.setBounds(new Rectangle(0, 69, 240, 35)); // 设大小 jTextField2.setEditable(false); jTextField3.setMinimumSize(new Dimension(10, 20)); jTextField3.setEditable(false); jTextField3.setText("版本: 2.3.0"); jTextField3.setBounds(new Rectangle(0, 102, 240, 37)); // 设大小 jTextField4.setText("最后修定时间: 2008-08-21"); // 加入文本内容 jTextField4.setBounds(new Rectangle(0, 139, 240, 30)); // 设大小 jTextField4.setEditable(false); jTextField5.setText(""); // 加入文本内容 jTextField5.setBounds(new Rectangle(1, 168, 240, 38)); // 设大小 jTextField5.setEditable(false); this.getContentPane().add(jTextField1); // 加文本到容器 this.getContentPane().add(jTextField2); // 加文本到容器 this.getContentPane().add(jTextField3); // 加文本到容器 this.getContentPane().add(jTextField4); // 加文本到容器 this.getContentPane().add(jTextField5); // 加文本到容器 } JTextField jTextField1 = new JTextField(); // 产生文本录入组件 JTextField jTextField2 = new JTextField(); JTextField jTextField3 = new JTextField(); // 产生文本录入组件 JTextField jTextField4 = new JTextField(); JTextField jTextField5 = new JTextField(); // 产生文本录入组件 }

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧