我是否正确使用了JavaSwing和graphics?

我是否正确使用了JavaSwing和graphics?,java,swing,Java,Swing,我正在学习java,必须使用java swing库和Graphics2D类做一些事情。基本上我必须画一个有多个部分的建筑起重机:一个主体(起重机的主体)和一些连接的臂(基本上看起来像这样:) 我的问题是,我是否正确使用了JavaSwing类?在下面的代码中,我省略了不必要的代码,因为我只想确保我的结构是正确的(正确使用JPanel、paintComponent()等)。任何帮助都将不胜感激,因为我正在学习Java!谢谢各位 public class CraneSimulator { .

我正在学习java,必须使用java swing库和Graphics2D类做一些事情。基本上我必须画一个有多个部分的建筑起重机:一个主体(起重机的主体)和一些连接的臂(基本上看起来像这样:)

我的问题是,我是否正确使用了JavaSwing类?在下面的代码中,我省略了不必要的代码,因为我只想确保我的结构是正确的(正确使用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)        
    }
}

您的代码结构良好,并遵循使用Java图形和OOP的良好实践


正如注释中所建议的,如果您没有理由将图形对象设为实例变量,最好将其定义为本地对象。

您的代码几乎完美无瑕。但有几点建议:

  • 对声明的初始化有一定的局限性
  • 你只需要一个鼠标捕捉器
  • 使用Graphics2D作为参数,这样就不需要从 又是图形
  • 删除字段“graphics”,改为将其设置为局部变量。(感谢 @纪尧姆波尔特)
  • 有些人可能不同意,但根据您的代码,我会做这些更改以使其更整洁

    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.
        }
    }
    

    对哦,天哪,是的!(对不起,这么多人做错了:P)。然而,我建议你建造你的起重机,使每一个起重机臂都是前一个的孩子。这意味着您可以(理论上)简单地通过将
    图形
    上下文传递给链中的每个子元素来合成旋转平移。基本上它看起来像crane.getArm().getArm().getArm()。。。直到你失去了武器,但那只是我+1对于实际正确使用Swing Graphics:DDon不要声明图形类字段,因为如果您无意中决定使用它,这会带来问题。这个变量应该是局部变量。@HovercraftFullOfEels Nice-pick,没看到你不知道听到这个消息我有多欣慰,哈哈。学习java有点紧张(C++在学校里教了3年),我不太确定是否掌握了一切。如果你们不介意的话,请继续提问:假设我想从左侧拖动第三只手臂,然后上下移动。我将在哪里设置此旋转?点击测试(检查鼠标是否在手臂内点击)是在MyPanel中完成的,那么我如何将必要的旋转传播到正确的手臂上?这个问题是否更适合于?我倾向于这样认为,因为实际上没有什么出错/出现错误,而OP是在询问代码的正确性……请注意,引用
    图形的字段实际上应该被删除。保留该引用实际上是一种非常糟糕的做法。请注意,引用
    graphics
    的字段实际上应该被删除。保留该引用实际上是一种非常糟糕的做法。