2016-08-03 16 views
1

Ich schreibe ein Programm mit Java, das ein Rechteck auf dem Bildschirm basierend auf Mauskoordinaten zeichnet. Ich habe jedoch Probleme, die richtige Farbe für dieses Rechteck zu erhalten. Das Ziel besteht darin, ein Rechteck mit der richtigen Farbe zu zeichnen, nachdem der Benutzer auf den Bildschirm geklickt und eine Farbe ausgewählt hat. Ich habe Fallszenarien ausprobiert, kann sie aber nicht richtig ausführen. Die nicht funktionierenden Teile sind kommentiert.Problem mit Rechteck Zeichnung Java Swing GUI

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.geom.*; 
import java.awt.event.*; 


public class test extends JFrame implements ActionListener, MouseListener, KeyListener { 
    Shape box = new Rectangle2D.Float(10, 10, 10, 10); 

    public test() { 

     setSize(250,150); 

     addMouseListener(this); 
     addKeyListener(this); 

     Color bgColor = new Color(125,125,125); 
     setBackground(bgColor); 

    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        test frame = new test(); 
        frame.setVisible(true); 
       } 
     }); 
    } 

    public void actionPerformed(ActionEvent ae) { 

    } 

    public void drawRectangle(int x, int y) { 

     Graphics g = this.getGraphics(); 
     // KeyEvent e = this.getKeyChar(); 

     // switch (test.keyTyped()) { 
     // case b: 
      g.drawRect(x, y, x, y); 
      g.setColor(Color.BLUE); 
      g.fillRect(x, y, 2, 2); 
     // case r: 
      // g.drawRect(x, y, x, y); 
      // g.setColor(Color.RED); 
      // g.fillRect(x, y, 2, 2); 
     // case y: 
      // g.drawRect(x, y, x, y); 
      // g.setColor(Color.Yellow); 
      // g.fillRect(x, y, 2, 2); 
     // case g: 
      // g.drawRect(x, y, x, y); 
      // g.setColor(Color.GREEN); 
      // g.fillRect(x, y, 2, 2); 
      //} 
    } 

    int x, y; 

    public void mouseClicked(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 
     repaint(); 
    } 

    public void keyTyped(KeyEvent e) { 

     char c = e.getKeyChar(); 
     c = Character.toLowerCase(c); 
    } 

    @Override 
    public void paint(Graphics g) { 

     g.setColor(Color.white); 
     g.drawString("Click anywhere to draw a rectangle", 50, 250); 
     g.drawString("Choose color by pressing the corresponding key on your keyboard: ", 50, 270); 

     g.setColor(Color.blue); 
     g.drawString("B: Blue ", 50, 285); 
     g.setColor(Color.red); 
     g.drawString("R: Red ", 95, 285); 
     g.setColor(Color.yellow); 
     g.drawString("Y: Yellow ", 140, 285); 
     g.setColor(Color.green); 
     g.drawString("G: Green ", 195, 285); 


     drawRectangle(x, y); 
    } 

    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 

    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub  
    } 
} 
+0

„Applet“ entfernt von Ihren Tags und Titel - du bist nicht ein Applet in dem obigen Code, sondern eine JFrame zu schaffen. –

Antwort

4

Sie können etwas tun:

HashMap<Integer, Color> colorsMap = new HashMap<>(); 
int selectedColor = Color.BLUE; 
public test() { 
    .... 
    colorsMap.put(KeyEvent.VK_B, Color.BLUE); 
    colorsMap.put(KeyEvent.VK_R, Color.RED); 
    colorsMap.put(KeyEvent.VK_Y, Color.YELLOW); 
    colorsMap.put(KeyEvent.VK_G, Color.GREEN); 
    .... 
} 

public void drawRectangle(Graphics g, int x, int y) { 
    g.setColor(selectedColor); 
    g.fillRect(x, y, 2, 2); 
} 
@Override 
public void paint(Graphics g) { 
    .... 
    drawRectangle(g, x, y); 
    .... 
} 
public void keyPressed(KeyEvent e) { 
    if(colorsMap.containsKey(e.getKeyCode())){ 
     selectedColor = colorsMap.get(e.getKeyCode()); 
    } 
} 
+0

Schön gemacht - und das Graphics-Objekt aus der GUI enthalten. 1+ –

+0

@HovercraftFullOfEels Danke. Ich habe das Graphics-Ding zuerst nicht bemerkt, ich merke es nur beim Lesen deiner Antwort. – Titus

+0

Danke, arbeite jetzt wie beabsichtigt. Musste nur die Rechtecke ändern – Daniel

4

Sie sind hart codierte die Farbe Ihrer Grafiken Farbzustand:

g.setColor(Color.BLUE); 

So sollte es nicht überraschen, dass es egal blau bleiben wird, was der Benutzer wählt.

Vorschläge:

  • nicht hart Code, um diese, sondern eine Farbe Variable in dieser Zeile verwenden, und den Zustand der Variable, wenn der Benutzer eine Farbe auswählt.
  • So Ihrer Klasse ein Farbfeld geben, sagt rectangleColor
  • In den Verfahren genannt, wo Sie Benutzereingaben erhalten, um den Wert dieses Feldes gesetzt und repaint() nennen.
  • Zeichnen Sie nicht innerhalb der Paint-Methode, sondern eine JPanel paintComponent-Methode.
  • Verwenden Sie nicht getGraphics(), um Ihr Graphics-Objekt zu erhalten, sondern führen Sie Ihre Zeichnung in der paintComponent-Methode mit dem Graphics-Objekt aus, das Ihnen die JVM gibt.
  • Vergessen Sie nicht, die Super-Malmethode, z. B. super.paintComponent(g), in Ihrer paintComponent-Methodenüberschreibung aufzurufen. Dies ermöglicht es dem JPanel, seine Gemälde zu malen.
+1

JFrame hat keine paintComponent() -Methode. – FredK

+1

@FredK: du hast Recht, danke. Er sollte nicht direkt im JFrame gezeichnet werden, sondern innerhalb der paintComponent-Methode eines JPanels. –