2013-02-13 20 views
1

我想顯示,只有當用戶輸入的輸入字段顯示在用戶交互文本字段

這裏值的文本字段是我的代碼:

import java.awt.BorderLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class PlayingAround { 

    JFrame frame; 
    JTextField display; 
    JTextField input; 

    public static void main(String[] args) { 
     PlayingAround obj = new PlayingAround(); 
     obj.create(); 
    } 

    private void create() { 
     frame = new JFrame(); 
     display = new JTextField(); 
     input = new JTextField(); 
     display.setEditable(false); 
     display.setVisible(false); 

     input.addKeyListener(new Listener()); 
     frame.add(BorderLayout.NORTH, display); 
     frame.add(BorderLayout.SOUTH, input); 

     frame.setSize(300, 300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    class Listener implements KeyListener { 

     @Override 
     public void keyTyped(KeyEvent e) { 
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      display.setVisible(true); 
      display.setText(input.getText()); 
     } 
    } 
} 

但我的問題是,顯示了JTextField,直到有像一些事件調整窗口大小,最小化和最大化窗口不可見。

我試圖在keyReleased方法中調用frame.repaint(),但它也沒有幫助。

+2

由於您使用的是佈局管理器,您可能需要調用的validate()在你的內容窗格。當您最大化/最小化窗口時,可能會發生這種情況。 – Nathan 2013-02-13 22:09:18

回答

4

在將文本字段組件放入容器後,應該在容納JTextField的容器上調用revalidate()repaint()。調用revalidate()向容器的佈局管理器發送請求以重新佈局其組件。 repaint()然後請求繪製管理器的JVM請求重新繪製新佈局的容器及其子組件。重繪()並不總是需要的,但通常是一個好主意。

此外,不使用的KeyListener這一點,而是在第一個文本組件的文檔的DocumentListener。這樣,如果用戶清空第一個文本組件,則可以根據需要使第二個文本組件消失。此外,文本可以在沒有按鍵的情況下輸入,並且您希望允許。

+0

謝謝。您能否爲Java GUI開發建議一本好書? – Snehasish 2013-02-13 22:25:29

+2

@Snehasish:我沒有GUI親,但大部分我所學到的左右搖擺是通過[的Java Swing教程]學會(http://docs.oracle.com/javase/tutorial/reallybigindex.html)與本網站。我也推薦Haase和Guy的[Filthy Rich Clients](http://filthyrichclients.org/)。 – 2013-02-13 22:33:53

+0

+1非常好的建議 – 2013-02-13 23:20:57

相關問題