2016-12-18 2 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 внутри прослушивателя клавиш (или привязки клавиш), измените поле объекта нажатием клавиши и переадресацией вызова.

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

Обратите внимание, что, если это GUI Качели, вы почти всегда лучше использовать Key Bindings и не KeyListener. Во-первых, у вас меньше проблем, когда вам нужно сосредоточиться.

Например:

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 и измените его состояние в своем прослушивателе клавиш, а затем вызовите перерисовку. –

+0

Благодарим за руководство! –

Смежные вопросы