2012-06-13 32 views
0

這段代碼是我將轉換爲swing的程序的簡化版本(使用JTextFieldDocumentListener)。我已經閱讀了一些教程,但我不能這樣做... 我不應該使用全局變量,我必須使用一些像getSource()getDocument()在這種情況下?),因爲在原始程序中JTextField的數量是可變的(它們在for內生成,所以它們沒有「名稱」)。該數字取決於寫入文本文件的值。使用TextField轉換Java程序以擺動JTextField

import java.awt.*; 
import java.awt.event.*; 

class TestWindow extends Frame { 
    public TestWindow() { 
     Panel p = new Panel(new FlowLayout()); 
     Label l = new Label("Temp"); 
     TextField tf1 = new TextField(); 
     TextField tf2 = new TextField(); 
     tf1.addTextListener(new myTextListener(l)); 
     tf2.addTextListener(new myTextListener(l)); 
     p.add(tf1); 
     p.add(tf2); 
     tf1.setColumns(10); 
     tf2.setColumns(10); 
     p.add(l); 
     add(p); 
     pack(); 
     setVisible(true); 
    } 

    class myTextListener implements TextListener { 
     Label input; 
     myTextListener(Label input) { 
      this.input = input; 
     } 
     public void textValueChanged(TextEvent e) { 
      input.setText(((TextField)(e.getSource())).getText()); 
     } 
    } 

} 

public class Test { 

    public static void main(String[] args) { 
     new TestWindow(); 
    } 

} 

回答

4

這是你發佈到Swing執行完全相同的任務代碼的直接轉換:

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 
import java.awt.FlowLayout; 

public class TestWindow extends JFrame { 

public TestWindow() { 
    JPanel p = new JPanel(new FlowLayout()); 
    JLabel l = new JLabel("Temp"); 
    JTextField tf1 = new JTextField(10); 
    JTextField tf2 = new JTextField(10); 
    tf1.getDocument().addDocumentListener(new MyDocumentListener(l)); 
    tf2.getDocument().addDocumentListener(new MyDocumentListener(l)); 
    p.add(tf1); 
    p.add(tf2); 
    p.add(l); 
    add(p); 
    pack(); 
    setVisible(true); 
} 

class MyDocumentListener implements DocumentListener{ 

    private JLabel label; 

    MyDocumentListener(JLabel label) { 
     this.label = label; 
    } 

    @Override 
    public void insertUpdate(DocumentEvent e) { 
     handleTextChange(e); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     handleTextChange(e); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     handleTextChange(e); 
    } 

    private void handleTextChange(DocumentEvent e) { 
     try { 
      label.setText(e.getDocument().getText(0,e.getDocument().getLength())); 
     } catch (BadLocationException ignored) { 
      //todo: handle exception properly although this should never happen 
     } 
    } 
} 

public static void main(String[] args) { 
    new TestWindow(); 
} 

} 

請注意的DocumentListener提供了用於處理比的TextListener文本改變事件的更多控制權,但我選擇用一種方法處理它們,以便與您的示例功能完全匹配

+0

非常感謝! – xonya

+0

@xonya:另請參見[初始線程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod