2016-04-24 9 views
0

画像上に四角形を付けた三角形(私が画像上にマークしたもの)をマークしようとしています。私は三角形をペイントすることができましたが、四角形でマークすることはできません。 は、ここで私はこれまでに書いたコードです:paintComponentとmouseListenerの問題

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

abstract class Places extends JComponent { 

    private boolean marked; 

    private String placeName; 
    private PlacePosition position; 
    private String placeColor; 
    private String placeCategory; 

    public Places(String name, String category, PlacePosition position) { 

     setBounds(position.x, position.y, 20, 20); 

     placeName = name; 
     this.position = position; 
     placeCategory = category; 
     this.placeColor = placeColor; 

     mouseListener mL = new mouseListener(); 
    } 

    public Color rightColor() { 
     Color c = Color.BLACK; 
     switch (placeCategory) { 
     case "None": 
      c = Color.BLACK; 
      break; 
     case "Buss": 
      c = Color.RED; 
      break; 
     case "Tunnelbana": 
      c = Color.BLUE; 
      break; 
     case "Tåg": 
      c = Color.GREEN; 
      break; 
     } 
     return c; 
    } 


    public PlacePosition getPosition() { 
     return position; 
     } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int[] polyX = { 0, 15, 30 }; 
     int[] polyY = { 0, 30, 0 }; 

     setBounds(position.x - 15, position.y - 30, 30, 30); 
     setPreferredSize(new Dimension(50, 50)); 
     setMaximumSize(new Dimension(50, 50)); 
     setMinimumSize(new Dimension(50, 50)); 
     g.setColor(rightColor()); 
     g.fillPolygon(polyX, polyY, 3); 

     if (marked) { 
      g.drawRect(30, 30, 30, 30); 
      g.setColor(Color.YELLOW); 
     } 

     repaint(); 
    } 

    abstract void printText(); 

    class mouseListener extends MouseAdapter { 
     public void mouseClicked(MouseEvent mE) { 
      if (SwingUtilities.isLeftMouseButton(mE)) { 
       if (!marked) { 
       marked = true; 
       } else { 
        marked = false; 
       } 
      } 

      revalidate(); 
      repaint(); 
     } 
    } 
} 

私の推測ではのMouseListenerでは動作しないものがあることですが、私は非常に不確実です。ヘルプは非常に高く評価されるだろう!

答えて

0

MouseListenerを何も追加しないので、MouseAdapterクラスは効果がありません。リスナーが機能するには、まず、リスナーをリッスン対象のコンポーネントに追加する必要があります。したがって、リスナーを追加する内容を把握し、そのコンポーネントのaddMouseListener(...)を呼び出します。

サイドの推奨:neverrepaint()からpaintComponentメソッドまたは他のペインティングメソッド内から呼び出します。

+0

おっと、これは迷惑なミスでした...あなたの助けをありがとう! –

+0

好奇心から、paintComponentメソッド内からrepaint()を呼び出すべきではないのはなぜですか? –

+0

@MyJärphed:あなたは本質的に、「貧乏人のゲームループ」を作り出しています。あなたがコントロールすることは絶対にありません。そして、基本的な方法でキーのSwingメソッドの動作を変えます。 paintComponentメソッドはペイントとペイントのみを目的としており、荒廃したゲームループには使用しないでください。 Swing Timerや他の構造を使って、より多くの制御を行うことができます。 –