2017-12-22 19 views
0

KeyListener interfaceを使用してフレームに文字列を描くためにこのコードを試しました。キーボードのタイプ可能なキーを押すたびにフレームに表示されますが、エラーはなくても機能しません。フレームに文字列が描画されないのはなぜですか?

誰かが間違いを教えてもらえますか?

以下は私のコードです:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class KeyevntFrame2 extends Frame { 
    Button b = new Button("ok"); 
    Button b1 = new Button("hey"); 
    char ch; 
    String s = ""; 

    public KeyevntFrame2() { 
     setTitle("understand key events"); 
     setSize(800, 600); 
     addKeyListener(new KeyHandler()); 
     setFont(new Font("Arial", Font.PLAIN, 35)); 
     setForeground(Color.BLACK); 
     add(b); 
     add(b1); 

     b.setBounds(200, 200, 100, 100); 
     b1.setBounds(200, 700, 100, 100); 
     setLayout(null); 

     b.addActionListener(new KeyHandler()); 
     b1.addActionListener(new KeyHandler()); 
    } 

    class KeyHandler implements KeyListener, ActionListener { 
     public void keyPressed(KeyEvent e) { 
      ch = e.getKeyChar(); 
      s = s + ch; 
      repaint(); 
     } 

     public void keyReleased(KeyEvent e) { 
     } 

     public void keyTyped(KeyEvent e) { 

     } 

     public void paint(Graphics g) { 
      g.drawString(s, 300, 200); 
      g.setFont(new Font("Arial", Font.PLAIN, 35)); 
     } 

     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(b1, "thank you for using java"); 
     } 
    } 

    public static void main(String a[]) { 
     KeyevntFrame2 f = new KeyevntFrame2(); 
     f.setVisible(true); 
    } 
} 
+1

ハンドラメソッドが実際にヒットしているかどうかを確認するためにブレークポイントを配置しましたか? – LordWilmore

+0

[私の質問に誰かが答えたときにどうすればいいですか?](https://stackoverflow.com/help/someone-answers) –

答えて

1
  1. のJava GUIは異なるロケールに異なるPLAFsを使用してなど異なるOS」、画面サイズ、画面の解像度で作業しなければなりません。したがって、ピクセルの完全なレイアウトには役立ちません。その代わりに、レイアウトマネージャーを使用するか、またはwhite spaceのレイアウトパディングと境界と共にcombinations of themを使用します。このアドバイスは、フレームが第2のボタンを表示するのに十分な高さを持たないことを考慮すると、このGUIに特に関係します。
  2. 1つのGUIにAWT(Frame)とSwing(JOptionPane)コンポーネントを混在させないでください。 GUIツールキットを選択してそれに固執する。
  3. 既存のメソッドの動作を変更したり、インターフェイスのメソッドを実装するときは、常に@Overrideの表記を使用してください。そうすると、KeyListenerActionListenerのどちらのインターフェイスもpublic void paint(Graphics)メソッドを定義していないことが警告されていました。
  4. KeyListenerActionListenerを組み合わせて定義することはあまり意味がありません。また、Button.addActionListener(..)を呼び出すと、それをKeyListenerとして追加するという効果があると考えることに混乱しています。それはできません。 new Font(Font.SANS_SERIF, Font.PLAIN, 35)である必要があり、クロスプラットフォームの堅牢性、用
  5. new Font("Arial", Font.PLAIN, 35)(例えばOS Xは通常、Arialフォントがインストールされていませんし、ユーザーがどのような場合にはHelveticaを見ることを好むだろう。)
  6. フォントを設定する必要はありませんまた、ペイント方法のフォントも変更できます。フレームで一度だけやってください。
  7. フレーム自体にフォーカスがないため、addKeyListener(..)を呼び出しても効果はありません。どのような場合でもスイングを使用してキーバインディングを実装する方がよい。
  8. カスタムペイント時には、常にsuperメソッドを最初に呼び出します。
  9. EDTでSwingおよびAWT GUIを起動する必要があります。
  10. "エラーがなくても動作しません。"上記のコードには多くのエラーがあります。コンパイルエラーでも、例外をスローするランタイムエラーでもないことだけです。コンパイラや仮想マシンがそれらを識別しなくても、Plentyはコードに間違いを起こす可能性があります。このため、「コード&貼り付け」コーディングは、コードが何を理解しているのか、決してうまくいかないのです。チュートリアルにアクセスし、Javaのドキュメントを読んでください。
関連する問題