2014-12-27 68 views
0

我想让这个GUI在有文本字段(下面的变量查询)的地方,并且如果GUI注意到某个键是键入的话,GUI将绘制出键入到文本字段的字符串按下。但是,如果我将字符串str初始化为“”,它在GUI上保持为“”并且永远不会改变,但是当我在paintComponent方法中打印出字符串时,它具有正确的字符串(由于某种原因,最后一个字符除外)。有小费吗?提前致谢!drawString没有正确写入字符串

private String str; 
private JTextField query; 
public void keyPressed(KeyEvent e) { 
     str = query.getText(); 
} 
... 
public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     //System.out.println(str); 
     g.drawString(str,20,30); 

} 
+0

您能否说明它为什么会发生变化? –

+2

那么,首先,不要将KeyListener与文本组件一起使用,请在该域中注册一个DocumentListener。确保在触发DocumentListener时调用重绘... – MadProgrammer

+0

'由于某种原因,最后一个字符除外'这是因为keypressed事件在字符追加到textfield之前触发。您可以使用keyrealesed.if要使用keypressed然后'query.getText()+ e.getKeyChar()'将解决这个问题,但澄清你的问题的其余部分 –

回答

3
  1. 不要使用KeyListener任何JTextComponent,它不是用于监视更改这些零部件的合适方法,而不是使用DocumentListener,当现场被调用setText或者文本修改了此会通知被粘贴到该领域,以及当用户键入的东西
  2. 确保您重新绘制该组件时该字段更新中...

你也应该避免直接画到SA因为布局经理可能会将内容放在自定义绘画的顶部

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Document; 

public class Test1 { 

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

    public Test1() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private String paintText; 

     public TestPane() { 
      JTextField field = new JTextField(10); 
      add(field); 
      field.getDocument().addDocumentListener(new DocumentListener() { 

       protected void update(DocumentEvent e) { 
        Document doc = e.getDocument(); 
        try { 
         paintText = doc.getText(0, doc.getLength()); 
         repaint(); 
        } catch (BadLocationException ex) { 
         ex.printStackTrace(); 
        } 
       } 

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

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

       @Override 
       public void changedUpdate(DocumentEvent e) { 
        update(e); 
       } 
      }); 
      field.setText("This is some text"); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      FontMetrics fm = g2d.getFontMetrics(); 
      int x = (getWidth() - fm.stringWidth(paintText))/2; 
      int y = ((getHeight() - fm.getHeight()) + fm.getAscent())/2; 
      g2d.drawString(paintText, x, y); 
      g2d.dispose(); 
     } 

    } 

}