你如何使用2个不同的类绘画

时间:2014-05-05 18:48:59

标签: java jframe jpanel paint jcomponent

(这个程序真的不会做任何我只是用它来学习/实验)

当我运行我的代码时,我希望一个类绘制一个黑色圆圈,另一个类绘制一个与其相交的蓝色圆圈。但是当我添加Class2的实例时,我现在拥有它的方式会覆盖Frame中的Class1。

我可以看到出了什么问题我还不确定如何修复它。

是否可以这样做,或者你是否应该在同一个油漆()下做所有事情?

public class Practice{
    public static GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    public static final int dWidth = gd.getDisplayMode().getWidth();
    public static final int dHeight = gd.getDisplayMode().getHeight();  

   public static void main(String[] args){
       heyo();
       }

   public static void heyo(){
       JFrame window = new JFrame();
       Class1 obj1 = new Class1();
       Class2 obj2 = new Class2();

        window.setSize(dWidth, dHeight);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        window.add(obj1);
        window.add(obj2);

        window.setVisible(true);
       }

}

public class Class1 extends JComponent{

    public void paint(Graphics b){
        Graphics2D brush = (Graphics2D)b;
        brush.setColor(Color.black);

        brush.drawOval(100, 100, 50, 50);

    }

}

public class Class2 extends JComponent{

    public void paint(Graphics c){
        Graphics2D brush = (Graphics2D)c;
        brush.setColor(Color.blue);

        brush.drawOval(200, 200, 50, 50);

    }

}

1 个答案:

答案 0 :(得分:0)

  • JFrame默认使用BorderLayout,您在中心添加了两个组件。

  • 使用JPanel并先在JPanel中添加组件,然后最后在JPanel

  • 中添加JFrame
  • 不要覆盖paint()方法而是使用paintComponent()

以下是示例代码:

class Class1 extends JComponent {

    @Override
    public void paintComponent(Graphics b) {
        super.paintComponent(b);
        ...    
    }

}

class Class2 extends JComponent {

    @Override
    public void paintComponent(Graphics c) {
        super.paintComponent(c);
        ...    
    }

}


public static void heyo() {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            JFrame window = new JFrame();

            JPanel panel = new JPanel(new GridLayout(1, 2));
            Class1 obj1 = new Class1();
            Class2 obj2 = new Class2();
            panel.add(obj1);
            panel.add(obj2);
            ...

            window.getContentPane().add(panel);
            window.setVisible(true);
        }
    });
}

enter image description here