2016-12-18 1 views
0

나는 위쪽 화살표 키 페인트를 눌렀을 때 화면의 섹션을 다시 그리지 만, paint()에는 keyPressed()가 포함될 수 없으며 keyPressed는 g2에 액세스 할 수 없습니다. 의견 있으십니까?keyListener를 사용하여 paint()를 업데이트하십시오.

public void paint(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setPaint(Color.RED.darker().darker()); 
    g2.fill(new Arc2D.Double(200, 100, 350, 350, 45, 90, Arc2D.PIE)); 
} 


@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)); 
    repaint(); 
} 

답변

0

이것은 스윙 페인팅이 수행 된 방식이 아닙니다. 키 리스너 (또는 키 바인딩) 내에서 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()); 
    } 
} 
+0

는 빠른 응답 주셔서 감사합니다! 실제로 위치 대신 호의 색상을 업데이트하려고합니다. 나는 분명히해야만했다. 의견 있으십니까? –

+0

@ShawnSharp : 예, 같은 생각입니다. 문제는 변수를 사용할 때 리터럴로 모든 것을 하드 코딩한다는 것입니다. Color 필드, arcColor를 만들고 키 수신기에서 상태를 변경 한 다음 repaint를 호출합니다. –

+0

안내해 주셔서 감사합니다. –

관련 문제