2016-08-03 23 views
1

私は、マウス座標に基づいて画面に矩形を描画するjavaを使用してプログラムを作成しています。しかし、私はこの四角形の正しい色を得ることができません。目標は、ユーザーが画面をクリックして色を選択した後、正しい色で矩形を描画することです。私はケースシナリオを試みましたが、正しく動作するようにはできません。動作していない部分はコメントされています。矩形描画の問題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

あなたのタグやタイトルから削除「アプレット」 - あなたはJFrameの上のではなく、コード内でアプレットを作成していないが。 –

答えて

4

あなたはこのような何か行うことができます。

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

うまくやられていて、GUIから与えられたGraphicsオブジェクトを含んでいます。 1 + –

+0

@HovercraftFullOfEelsありがとうございます。最初はGraphicsのことに気付かず、あなたの答えを読んでいる間だけ認識していました。 – Titus

+0

ありがとうございました。 – Daniel

4

あなたのグラフィックの色状態の色をハードコーディングしている:

g.setColor(Color.BLUE); 

だから、それは関係なく、ユーザが選択したものを青残っていないということは驚きがあってはなりません。

提案:

  • は、このハードコードしないが、代わりにこの行に色の変数を使用して、ユーザーが色を選択したときに、変数の状態を設定します。
  • あなたのクラスには、たとえばrectangleColor
  • というユーザーの入力を得る方法でこのフィールドの値を設定し、repaint()を呼び出してください。
  • paintメソッド内で描画するのではなく、JPanelのpaintComponentメソッドを描画します。
  • Graphicsオブジェクトを取得するのにgetGraphics()を使用しないでください。代わりに、JVMが提供するGraphicsオブジェクトを使用してpaintComponentメソッドで図面を作成してください。
  • super paintメソッドを呼び出すことを忘れないでください。たとえば、paintComponentメソッドオーバーライドのsuper.paintComponent(g)などを呼び出します。これにより、JPanelはハウスキーピングペインティングを実行できます。
+1

JFrameにはpaintComponent()メソッドがありません。 – FredK

+1

@FredK:そうです、ありがとうございます。 JPanelのpaintComponentメソッドに関係なく、JFrameに直接描画するべきではありません。 –