2017-12-22 59 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. 자바 GUI를 다른 로케일에서 다른 PLAFs를 사용하는 등 다른 OS ', 화면 크기, 화면 해상도에서 작동해야합니다. 따라서, 픽셀 완벽한 레이아웃에 도움이되지 않습니다. 대신 레이아웃 관리자를 사용하거나 white space의 레이아웃 패딩 및 테두리와 함께 combinations of them을 사용하십시오. 프레임에 두 번째 버튼을 표시 할만큼의 높이가없는 경우이 조언은 특히이 GUI와 관련이 있습니다.
  2. 하나의 GUI에 AWT (Frame) 구성 요소와 Swing (JOptionPane) 구성 요소를 함께 사용하지 마십시오. GUI 도구 키트를 선택하고 사용하십시오.
  3. 기존 메서드의 동작을 변경하거나 인터페이스의 메서드를 구현할 때는 항상 @Override 표기법을 사용하십시오. 그러면 KeyListener이나 ActionListener 인터페이스 중 public void paint(Graphics) 메서드가 정의되어 있지 않다고 경고했을 것입니다.
  4. KeyListenerActionListener의 결합을 정의하는 것은 의미가 없으며 결합 된 청취자 인 Button.addActionListener(..)KeyListener으로 추가하는 효과가 있다고 생각하도록 혼란 스럽습니다. 그렇지 않습니다. 해야한다 크로스 플랫폼의 견고성
  5. new Font("Arial", Font.PLAIN, 35)
  6. , new Font(Font.SANS_SERIF, Font.PLAIN, 35) (예 : OS X는 일반적으로 설치 Arial 글꼴이 없습니다, 사용자는 어떤 경우에 헬 베티를 참조하는 것을 선호합니다.)
  7. 을 글꼴을 설정할 필요가 없습니다 프레임의 글꼴, 그리고 paint 메소드의 글꼴. 프레임에서 한 번만 수행하십시오.
  8. 프레임 자체에 포커스를 설정할 수 없기 때문에 addKeyListener(..)을 호출해도 아무런 효과가 없습니다. 어떤 경우에도 스윙을 사용하고 키 바인딩을 구현하는 것이 좋습니다.
  9. 사용자 정의 페인팅을 할 때는 항상 super 메소드를 먼저 호출하십시오.
  10. EDT에서 스윙 및 AWT GUI를 시작해야합니다.
  11. "오류가 없어도 작동하지 않습니다." 위의 코드에는 많은 오류가 있습니다. 단지 컴파일 오류가 아니며 예외를 throw하는 런타임 오류도 아닙니다. 컴파일러 나 가상 머신이 코드를 식별하지 못하더라도 여전히 많은 코드가 코드로 갈 수 있습니다. 이런 이유로 '컷 & 붙여 넣기'코드가 코드의 기능을 이해하지 못하고 작동하지 않습니다. 자습서를 읽고 Java 문서를 읽으십시오.