8

私はちょうどJavaを学んでいて、JavaスイングライブラリとGraphics2Dクラスを使って何かをしなければなりません。基本的に、ボディ (クレーンの本体) と多数の取り付けられたアーム (基本的には次のようになります: http://i.imgur.com/4YIkYqW.jpg )の複数のパーツを持つ建設用クレーンを描画する必要があります。.

私の質問は、Java スイング クラスを正しく使用しているかどうかについてです。以下のコードでは、構造が正しいことを確認したいだけなので (JPanel、paintComponent() などを正しく使用して)、不要なコードを省略しました。私はJavaを学んでいるので、どんな助けでも大歓迎です! みんなありがとう。

public class CraneSimulator {

    ...
    public JFrame frame;
    public MyPanel panel;

    public CraneSimulator() {
        frame = new JFrame("CraneSimulator");

        ...

        panel = new MyPanel();
        frame.add(panel);

    }

    public static void main(String[] args) {
        CraneSimulator simulator = new CraneSimulator();    
    }
}   

class MyPanel extends JPanel {
    CraneBody body;
    CraneArm arm1;
        ...
    Graphics2D graphics;

    public MyPanel() {
        body = new CraneBody();
        arm1 = new CraneArm(body);
        ...
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                ...         }
            }
            public void mouseReleased(MouseEvent e) {
                    ...
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                ...             
            }
        });
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        graphics = (Graphics2D) g;
        ...
        body.paint(g);      
        arm1.paint(g);  
    }
}

class CraneBody {
    ...

    public CraneBody() {
         ....
    }
    ...
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

            // Use g2 to actual paint crane Body on screen here (ie. g2.drawRect, etc)      
    }
}

class CraneArm {
    ...

    public CraneArm() {
         ....
    }
    ...
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

            // Use g2 to actual paint the crane armon screen here (ie. g2.drawRect, etc)        
    }
}
4

2 に答える 2

3

あなたのコードは適切に構成されており、Java Graphics と OOP を使用した優れたプラクティスに従っています。

コメントで示唆されているように、インスタンス変数にする理由がない場合は、Graphics オブジェクトをローカルに定義することをお勧めします。

于 2013-02-08T06:14:30.647 に答える
1

あなたのコードはほぼ完璧です。しかし、いくつかの提案:

  1. 宣言時の初期化にはいくつかの利点があります。
  2. MouseAdapter は 1 つだけ必要です。
  3. Graphics2D を引数として使用すると、Graphics から再度キャストする必要がなくなります。
  4. フィールド「graphics」を削除し、代わりにローカル変数にします。(@GuillaumePoletに感謝します)。

同意しない人もいるかもしれませんが、あなたのコードによれば、これらの変更を行ってよりきれいにします。

public class CraneSimulator {
    ...
    private JFrame frame = new JFrame("CraneSimulator");
    private MyPanel panel = new JPanel();

    public CraneSimulator() {
        ...
        frame.add(panel);
    }
    public static void main(String[] args) {
        CraneSimulator simulator = new CraneSimulator();    
    }
}   

class MyPanel extends JPanel {
    CraneBody body = new CraneBody();
    CraneArm arm1 = new CraneArm(body);
    ...
    MouseAdapter mAdapter = new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            ...
        }
        public void mouseReleased(MouseEvent e) {
            ...
        }
        public void mouseDragged(MouseEvent e) {
            ...             
        }
    }

    public MyPanel() {
        ...
        addMouseListener(mAdapter);
        addMouseMotionListener(mAdapter);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D graphics = (Graphics2D) g;
        ...
        body.paint(graphics);
        arm1.paint(graphics);  
    }
}

class CraneBody {
    ...
    public CraneBody() {
         ....
    }
    ...
    public void paint(Graphics2D g) {
        // You don't need to cast a Graphics again.      
    }
}

class CraneArm {
    ...
    public CraneArm() {
         ....
    }
    ...
    public void paint(Graphics2D g) {
        // You don't need to cast a Graphics again.
    }
}
于 2013-02-08T09:33:42.463 に答える