2012-02-16 9 views
3

私はここでJavaを学んでおり、クラスを習得しようとしています。私の小さなゲームのためにマウスイベントなどをキャッチするのに最適な方法ですので、気をつけていくつかヒントを与えてください。マウスイベントハンドリングコードはどこに置くことができますか?しかし、それは途方もなく、オブジェクトを操作できますか?

私のプロジェクトのメインクラスはJFrameで、構築時にはJPanelに拡張されたクラスのオブジェクトが追加されます。このJPanelは全体のウィンドウをカバーしています。これは私がスクリーンにものをペイントするために使用しているものです。次に、私はSceneというクラスを持っていますが、これは何も拡張していませんが、現在のオブジェクトへのすべての参照を画面に保存し、すべてをコンパイルしてJPanelに戻します。私はJPanelに完全なマウスイベントコードを入れたくありませんでした。なぜなら、私はMEsと呼ばれる別のクラスを作成し、各シーンに1つを持たせることになりました。私の考えは、このようにして各mesオブジェクトは各シーンのオブジェクトに簡単にアクセスできます。だから私のコードは次のように探しています:

class DPanel extends JPanel { 
    Scene scCurrent; 

    public DPanel() { 
     scCurrent = new Scene(); 
     addMouseMotionListener(new MouseAdapter() { 
      public void mouseMoved(MouseEvent me) { scCurrent.mes.moved(me); } 
     }); 
... 
    } 

... 

もちろん、​​私も、カーソルを変更する方法がわかりません。そこにはsetCursor()が認識されません。シーンを切り替える必要があるように、ツリーの上にあるカーソルやアクセスオブジェクトを変更するにはどうすればよいですか?または、JPanelをバンパーアウトしないマウスイベントの処理コードをタックすることができる他の場所がありますか?

答えて

4

コントロールコードをビュー(GUI)コードから切り離そうとしていますが、これはといい、です。解決方法は、外部コードが状態を変更できるようにビューコードにパブリックメソッドを与え、コントロール(つまり、MouseListeners、MouseMotionListeners、ActionListeneres)がこれらのメソッドを適切な参照で呼び出せるように、コントロールクラスにビューへの参照を与えることですビューの状態を変更します。

ちょうどあなたの一例を示すために容易であろう1
編集:あなたの返事ウナギの@Hovercraft全ため

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

public class ViewControl { 

    private static void createAndShowGui() { 
     View view = new View(); 
     Control control = new Control(view); 
     view.addMouseAdapter(control); 

     JFrame frame = new JFrame("ViewControl"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(view); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class View extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private List<Point> points = new ArrayList<Point>(); 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (points.size() > 1) { 
     for (int i = 0; i < points.size() - 1; i++) { 
      int x1 = points.get(i).x; 
      int y1 = points.get(i).y; 
      int x2 = points.get(i + 1).x; 
      int y2 = points.get(i + 1).y; 

      g.drawLine(x1, y1, x2, y2); 
     } 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public void addMouseAdapter(MouseAdapter adapter) { 
     // addMouseListener(adapter); 
     addMouseMotionListener(adapter); 
    } 

    public void addPoint(Point p) { 
     points.add(p); 
     repaint(); 
    } 
} 

class Control extends MouseAdapter { 
    private View view; 

    public Control(View view) { 
     this.view = view; 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     view.addPoint(e.getPoint()); 
    } 
} 
+0

おかげで、それは私が必要なアドバイスのようなもののように聞こえます。とてもエレガントでシンプルに聞こえます!しかし、どのようにコントロールクラスにリファレンスを渡すことができますか? 'scCurrent.mes.moved(this、私);のような別の変数として参照を受け入れるようにコントロールクラスを適応させようとすると' this'はmouseadapterを意味します –

+0

@Jimmy_Bob:** edit 1のサンプルコードを見てください* * –

+0

ああ、 'MouseAdapter'を拡張して、あなたがJPanelを独創的にするのと同じレベルで新しいインスタンスを作成するときに参照を与える新しいクラスを作ることで!ありがとう@ホーバークラフトえりなさい、これは今よりはっきりとしています:) –

関連する問題