2015-06-21 48 views
0
import javax.swing.*; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class TheSize extends JFrame implements ActionListener, KeyListener { 
    static String inText=""; 
    JPanel pane=new JPanel(); 
    JLabel word0=new JLabel("I would like my grid to be 2^",JLabel.RIGHT); 
    JLabel word1=new JLabel("* 2^ "+inText,JLabel.RIGHT); 
    JButton finish=new JButton("I'm done"); 
    JTextField size=new JTextField("",3); 

    public TheSize(){ 
     super("size"); 
     System.out.println("hi"); 
     setLookAndFeel(); 
     setSize(550,100); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     FlowLayout box=new FlowLayout(); 
     setLayout(box); 
     pane.add(word0); 
     pane.add(size); 
     pane.add(word1); 
     pane.add(finish); 
     finish.addActionListener(this); 
     add(pane); 
     setVisible(true); 
     pack(); 
     size. addKeyListener(this); 
     setFocusable(true); 
    } 
    private void setLookAndFeel() { 
     try { 
      UIManager.setLookAndFeel(
        "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" 
        ); 
     } catch (Exception exc) { 
      // ignore error 
     } 
    } 
    public void actionPerformed(ActionEvent e) { 


    } 
    @Override 
    public void keyPressed(KeyEvent arg0) { 
    } 
    @Override 
    public void keyReleased(KeyEvent arg0) { 

    } 
    @Override 
    public void keyTyped(KeyEvent e) { 
     inText=size.getText(); 
     pane.revalidate(); 
     pane.repaint(); 

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


} 

幾件事情JFrame.repaint()和JFrame.revalidate()不工作

我確定的KeyListener工作,並且它不工作在沒有輸出,它沒」不要給我任何錯誤。

應該發生什麼:

應該彈出它說,我想我的網格爲2^__(用戶輸入文本字段)的框架____ * 2 ^(什麼是在文本框)。 (按鈕爲我完成)。

enter image description here

然而,(什麼是在文本字段)後,我輸入一些東西到文本字段保留爲空。我檢查了程序是否使用System.out.println();聽到了我的按鍵,並且它正在工作,所以revalidate();repaint()命令一定不是(我也通過在我的構造函數中放置了一個System.out.println()來測試它;在此先感謝

回答

3

上一個JTextField切勿使用的KeyListener。擺脫的KeyListener和JTextField中應該會接受的文字就好了。相反,如果你想註冊用戶輸入,使用的DocumentListener,如果你只是想要的文字,但不會過濾它,或者某個DocumentFilter如果你需要它顯示之前的文本進行過濾。這類問題已經被問很多次在這個網站。

還要注意,即使您使用DocumentListener,因爲您在word1 JLabel上調用setText(...),但絕不會重新調用此方法,所以JLabel將永遠不會更改。只是改變inText字符串變量引用的字符串當然不會奇蹟般地改變JLabel顯示的文本。

請注意,我不知道你在replicate()命令的意思,因爲我沒有聽說過這個方法所。你的意思是revalidate()如果是這樣,請澄清。


例如:

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 

// Avoid extending JFrames if at all possible. 
// and only extend other components if needed. 
@SuppressWarnings("serial") 
public class TheSize2 extends JPanel { 
    private static final String FORMAT = "* 2^ %s"; 
    private static final int PREF_W = 550; 
    private static final int PREF_H = 100; 
    private String inText = ""; 
    private JLabel word0 = new JLabel("I would like my grid to be 2^", JLabel.RIGHT); 
    private JLabel word1 = new JLabel(String.format(FORMAT, inText), JLabel.RIGHT); 
    private JButton finish = new JButton("I'm done"); 
    private JTextField size = new JTextField("", 3); 

    public TheSize2() { 
     finish.setAction(new FinishAction("I'm Done")); 
     size.getDocument().addDocumentListener(new SizeListener()); 
     add(word0); 
     add(size); 
     add(word1); 
     add(finish); 
    } 

    @Override // make JPanel bigger 
    public Dimension getPreferredSize() { 
     Dimension superSz = super.getPreferredSize(); 
     if (isPreferredSizeSet()) { 
     return superSz; 
     } 
     int prefW = Math.max(superSz.width, PREF_W); 
     int prefH = Math.max(superSz.height, PREF_H); 
     return new Dimension(prefW, prefH); 
    } 

    private class SizeListener implements DocumentListener { 
     private void textUpdated(DocumentEvent e) { 
     try { 
      inText = e.getDocument().getText(0, e.getDocument().getLength()); 
      word1.setText(String.format(FORMAT, inText)); 
     } catch (BadLocationException e1) { 
      e1.printStackTrace(); 
     } 
     } 

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

     @Override 
     public void insertUpdate(DocumentEvent e) { 
     textUpdated(e); 

     } 

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

    } 

    private class FinishAction extends AbstractAction { 
     public FinishAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     Component comp = (Component) e.getSource(); 
     if (comp == null) { 
      return; 
     } 
     Window win = SwingUtilities.getWindowAncestor(comp); 
     if (win == null) { 
      return; 
     } 
     win.dispose();   
     } 
    } 

    private static void createAndShowGui() { 
     TheSize2 theSize2 = new TheSize2(); 

     JFrame frame = new JFrame("The Size"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(theSize2); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

是的,我的意思是revalidate(),我只是改變了它。我修復了一下程序,回想一下構造函數中的JTextField「size」,但它仍然不起作用。我想像revalidate()重新構造像repaint()重新運行paint()或paintComponent()?順便說一下,我在「changedUpdate」中留下了一個System.out.println(「hi」),爲什麼每次我在TextField中輸入某些內容時都不打印它,因爲它應該在TextField中分離一個chagne;否則,我想的KeyListener實際上可能比的DocumentListener更好地工作。 –

+0

順便說一句,我不知道如果我說得很清楚,但我試圖讓我的TextField對chagne第二用戶開始輸入的文本字段或chagne它。 –

+0

@ user3618683:是的,我知道你在做什麼,再次請讓我絕對清楚 - 一個KeyListener是**不是**的方式來做到這一點。再次,使用一個DocumentListener,正如我上面已經演示的那樣。你說,''我認爲KeyListener實際上可能比DocumentListener工作得更好 - 「不要粗魯,但我已經在Swing很長時間了,當你開始在文本組件上擺弄KeyListeners時,你冒險搞砸了文本組件本身的功能。嚴重的是,避免在大多數情況下使用它們。 –

-2

我發現氣墊船全鰻的幫助下,解決方案,所有我錯過了重新的setSize。這不是最好的解決方案,但它足夠簡單讓我理解。

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class TheSize extends JFrame implements ActionListener, KeyListener { 
    static String inText=""; 
    JPanel pane=new JPanel(); 
    JLabel word0=new JLabel("I would like my grid to be 2^",JLabel.RIGHT); 
    JLabel word1=new JLabel("* 2^ "+inText,JLabel.RIGHT); 
    JButton finish=new JButton("I'm done"); 
    JTextField size=new JTextField("",3); 

    public TheSize(){ 
     super("size"); 
     setLookAndFeel(); 
     setSize(550,100); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     FlowLayout box=new FlowLayout(); 
     setLayout(box); 
     pane.add(word0); 
     pane.add(size); 
     pane.add(word1); 
     pane.add(finish); 
     finish.addActionListener(this); 
     add(pane); 
     setVisible(true); 
     pack(); 
     size.addKeyListener(this); 
     setFocusable(true); 
    } 
    private void setLookAndFeel() { 
     try { 
      UIManager.setLookAndFeel(
        "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" 
        ); 
     } catch (Exception exc) { 
      // ignore error 
     } 
    } 
    public void actionPerformed(ActionEvent e) { 


    } 

    public static void main(String[] args){ 
     new TheSize(); 
    } 
    @Override 
    public void keyPressed(KeyEvent arg0) { 

    } 
    @Override 
    public void keyReleased(KeyEvent arg0) { 
     inText=size.getText(); 
     word1.setText("* 2^ "+inText); 
     pane.revalidate(); 
     pane.repaint(); 

    } 
    @Override 
    public void keyTyped(KeyEvent arg0) { 

    } 


}