2012-03-05 2 views
2

스윙의 작동 방식에 대한 이해가 부족하여 이상한 문제가 생겼습니다. 프로그램 시작 이후 처음으로, 알파벳 키 중 하나를 누르 자마자 창 프레임 안에 패널을 새로 만들려고 할 때, 문제의 문자는 패널이 다시 흰색으로 변하기 전에 패널에 매우 간단하게 그려집니다 .Java Swing Graphics - 처음 렌더링이 예상대로 작동하지 않는 이유는 무엇입니까?

다음 키 스트로크에서 프로그램은 예상대로 작동합니다. 패널은 누른 키와 관련된 문자로 다시 렌더링됩니다.

첫 번째 키 스트로크에서 문자 IS를 그렸기 때문에 즉시 사라지는 사실은 패널이 다시 렌더링되어 이전 내용을 다시 오버라이드해야 함을 의미합니다.

// Main.java 
public class Main { 
public static void main(String[] args) { 
    new GlyphFrame(new GlyphPanel()); 
} 
} 

// --------------------------------------------------- 

// GlyphFrame.java 
import javax.swing.JFrame; 

public class GlyphFrame extends JFrame { 
private static final long serialVersionUID = -7754180294993638709L; 

private final int WIDTH = 500; 
private final int LENGTH = 400; 

public GlyphFrame(GlyphPanel panel){ 
    this.add(panel); 
    this.setSize(WIDTH, LENGTH); 
    this.setVisible(true); 
    } 
} 

// --------------------------------------------------- 
// GlyphPanel.java 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 

public class GlyphPanel extends JPanel { 
private static final long serialVersionUID = -6330730323655696958L; 

public GlyphPanel(){ 
    this.setBackground(Color.WHITE); 
    this.setFocusable(true); 
    this.requestFocusInWindow(); 
    this.setFont(new Font("Dialog", Font.PLAIN, 12)); 

    this.addKeyListener(new GlyphKeyListener(this)); 
} 

private void paintPanel(Graphics g, char c){ 
    super.paintComponent(g); 
    g.drawString("" + c, 10, 10); 
    g.setColor(this.getBackground()); 
    g.fillRect(0, 0, this.getWidth(), this.getHeight()); 

    g.setColor(Color.BLACK); 
    g.drawString("" + c, 10, 10); 

} 

private class GlyphKeyListener implements KeyListener{ 

    private GlyphPanel panel; 
    private int i = 0; 

    public GlyphKeyListener(GlyphPanel panel){ 
    this.panel = panel; 
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

     @Override 
    public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode() >= KeyEvent.VK_A && e.getKeyCode() <= KeyEvent.VK_Z){ 
      System.out.println("Call number " + (++i)); 
     panel.paintPanel(panel.getGraphics(), e.getKeyChar()); 
    } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) {} 
} 
} 

편집 : 답변 주셔서 감사합니다

여기에 코드입니다. 이제 스윙에서 그림이 어떻게 작동하는지 이해합니다.

패널을 다시 그려야하는 경우 repaint()을 호출하면 시스템에 paintComponent(Graphics g)이 호출됩니다. 따라서, 내가 페인트하고자하는 것은 무엇이든 그것을 재정의 된 paintComponent() 메소드에 넣었다. paintComponent()은 직접 호출되지 않습니다. repaint() 만 사용하십시오.

+0

@Konstantin은 대답에 대해 (1+ 이상) 정확합니다. 그것의 어떤 부분이 당신을 혼란스럽게한다면, 우리에게 명확히 해달라고 요청하십시오. –

+0

오류는 someComponent.getGraphics를 사용하는 것입니다. 단순히 Swing에서는 사용하지 마십시오. – kleopatra

+0

paintComponent()가 제대로 작동하는 것 같습니다. 그러나 내가 현재 가지고있는 패널에서 getGraphics를 호출하지 않아도된다면 필요한 그래픽 객체는 어디에서 구할 수 있습니까? –

답변

5

paintPanel을 직접 호출하면 안됩니다. 스윙은 그림 자체를 관리합니다. 대신에 다음을 수행해야합니다.

  • Override JComponent.paintComponent (Graphics g); 필드를 사용하여 눌려진 문자를 가져와야합니다.
  • 키를 눌렀을 때 필드를 설정하고 JComponent.repaint()를 호출해야합니다.

정상적으로 작동합니다.

관련 문제