[英]read data from file to jtextfield1 and display in jtextfield2
我試圖將數據從文本文件讀取到Jtextfield1並顯示在jtextfield2中,數據從文本文件讀取到jtextfield1,但在jtextfield2中不顯示任何內容,直到我們在jtextfield1中輸入一個值。在jtextfield1中,它應該反映在jtextfield2中。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.io.*;
import java.util.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class Sh extends JFrame
{
public Sh()
{
super("SH");
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
final JTextField field = new JTextField(10);
panel.add(field);
try{
InputStream ips=new FileInputStream("test.txt");
InputStreamReader ipsr=new InputStreamReader(ips);
BufferedReader br=new BufferedReader(ipsr);
String line;
while ((line=br.readLine())!=null){
field.setText(line);
}
br.close();
}
catch (Exception e){
e.printStackTrace();
}
final JTextField field1 = new JTextField(10);
panel.add(field1);
final DocumentListener docListener = new DocumentListener(){
private Document originator;
@Override
public void changedUpdate(DocumentEvent e) {
updateLabel(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
updateLabel(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
updateLabel(e);
}
private void updateLabel(DocumentEvent e) {
if (null == originator) {
originator = e.getDocument();
String text = "";
try {
text = originator.getText(0, originator.getLength());
} catch (final Exception ex) {
ex.printStackTrace();
}
if (!text.isEmpty()) {
final int p = Integer.parseInt(text);
if (originator.equals(field.getDocument())) {
final int i = (p + 1);
final String s = String.valueOf(i);
field1.setText(s);
} else {
final int i = (p - 1);
final String s = String.valueOf(i);
field.setText(s);
}
} else {
field.setText(text);
field1.setText(text);
}
originator = null;
}
}
};
field.getDocument().addDocumentListener(docListener);
field1.getDocument().addDocumentListener(docListener);
final DocumentFilter docFilter = new DocumentFilter(){
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
};
((AbstractDocument) field.getDocument()).setDocumentFilter(docFilter);
((AbstractDocument) field1.getDocument()).setDocumentFilter(docFilter);
}
public static void main(String[] args)
{
final Sh s = new Sh();
s.setDefaultCloseOperation(EXIT_ON_CLOSE);
s.pack();
s.setVisible(true);
}
}
文字檔:5487
您的邏輯幾乎是正確的。但是代碼中的主要問題是在添加文檔偵聽器之前通過.txt文件更新文本字段。您必須在更改文本字段之前添加文檔偵聽器,否則文本字段將無法收聽文檔更改..您要做的就是移動settext()代碼部分到文檔偵聽器代碼的末尾
field.getDocument().addDocumentListener(docListener);
field1.getDocument().addDocumentListener(docListener);
///////////you should change text field after adding document listner not before//////////////////
/* move textfield settext code part like that*/
try {
InputStream ips = new FileInputStream("test.txt");
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String line;
while ((line = br.readLine()) != null) {
field.setText(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
//////////////////////////////////////////////////////////////////////////////////////
和替代好的解決方案。
您可以在兩個文本字段中共享同一文檔,因此,當您更改一個文本字段時,另一個文本字段也會被更改。那么您在字段中不能有不同的文本。您在field1中有一個文本。相同的文本在文本字段2中。
field.setDocument(field1.getDocument());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.