이것은 스윙 페인팅이 수행 된 방식이 아닙니다. 키 리스너 (또는 키 바인딩) 내에서 Graphics 객체를 직접 조작하는 대신 key press 및 call repaint를 사용하여 객체의 필드를 변경하십시오. 이것은 스윙 GUI 경우, 당신은 거의 항상 Key Bindings 아니라 모든 KeyListener를 사용하는 것이 더 낫다 것을
는
private Arc2D myArc = null;
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (myArc != null) {
g2.setPaint(Color.RED.darker().darker());
// g2.fill(new Arc2D.Double(200, 100, 350, 350, 45, 90, Arc2D.PIE));
g2.fill(myArc);
}
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP) {
System.out.println("Pressed Up Key");
// g2.setPaint(Color.RED);
// g2.fill(new Arc2D.Double(200, 100, 350, 350, 45, 90, Arc2D.PIE));
// here change or create new Arc2D object and assign to myArc
// perhaps changing the Y location of the arc
myArc = // .... critical code here
// then repaint
repaint();
}
참고. 하나는 초점을 잡아야하는 번거 로움이 적습니다. 예를 들어
:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Arc2D;
import javax.swing.*;
@SuppressWarnings("serial")
public class ColorArc extends JPanel {
private static final int PREF_W = 600;
private static final int PREF_H = 450;
private int arcX = 150;
private int arcY = 150;
private float hue = 0.5f;
private float saturation = 0.5f;
private float brightness = 0.5f;
private Color arcColor = Color.getHSBColor(hue, saturation, brightness);
private Arc2D myArc = new Arc2D.Double(arcX, arcY, 300, 300, 45, 90, Arc2D.PIE);
public ColorArc() {
addKeyListener(new MyKey());
setFocusable(true);
requestFocusInWindow();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (myArc != null) {
Graphics2D g2 = (Graphics2D) g;
// use rendering hints to help draw a smooth graphic
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(arcColor);
g2.fill(myArc);
}
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H); // set GUI's preferred size
}
private class MyKey extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP) {
hue += 0.01f;
hue %= 1.0f;
} else if (keyCode == KeyEvent.VK_LEFT) {
saturation += 0.01f;
saturation %= 1.0f;
} else if (keyCode == KeyEvent.VK_RIGHT) {
brightness += 0.01f;
brightness %= 1.0f;
} else {
return;
}
arcColor = Color.getHSBColor(hue, saturation, brightness);
repaint();
}
}
private static void createAndShowGui() {
ColorArc mainPanel = new ColorArc();
JFrame frame = new JFrame("Color Arc");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
는 빠른 응답 주셔서 감사합니다! 실제로 위치 대신 호의 색상을 업데이트하려고합니다. 나는 분명히해야만했다. 의견 있으십니까? –
@ShawnSharp : 예, 같은 생각입니다. 문제는 변수를 사용할 때 리터럴로 모든 것을 하드 코딩한다는 것입니다. Color 필드, arcColor를 만들고 키 수신기에서 상태를 변경 한 다음 repaint를 호출합니다. –
안내해 주셔서 감사합니다. –