스윙의 작동 방식에 대한 이해가 부족하여 이상한 문제가 생겼습니다. 프로그램 시작 이후 처음으로, 알파벳 키 중 하나를 누르 자마자 창 프레임 안에 패널을 새로 만들려고 할 때, 문제의 문자는 패널이 다시 흰색으로 변하기 전에 패널에 매우 간단하게 그려집니다 .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()
만 사용하십시오.
@Konstantin은 대답에 대해 (1+ 이상) 정확합니다. 그것의 어떤 부분이 당신을 혼란스럽게한다면, 우리에게 명확히 해달라고 요청하십시오. –
오류는 someComponent.getGraphics를 사용하는 것입니다. 단순히 Swing에서는 사용하지 마십시오. – kleopatra
paintComponent()가 제대로 작동하는 것 같습니다. 그러나 내가 현재 가지고있는 패널에서 getGraphics를 호출하지 않아도된다면 필요한 그래픽 객체는 어디에서 구할 수 있습니까? –