过渡到抽象类

时间:2013-05-29 04:49:55

标签: java drawing 2d abstract

我拼命想要实施一些我认为不完全理解的事情。我正在尝试设置它,以便可以采取注释掉的操作(我需要更改语法,但我想确保我首先在正确的轨道上)。

我是以正确的方式来做这件事的吗?如果没有绘制方法,我的绘图操作将在哪里?我把它移到那里时会遇到很多错误。感谢

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Graphics2D;
import java.awt.Graphics;

public class Test extends JPanel{

    abstract class graphic {
        public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        private int[] location = new int[] {screenSize.width/2,screenSize.height/2}; 
    }

    public class gladiator extends graphic {
        void draw() {
        //g2d.setColor(Color.green);
        //g2d.fillArc(location[0], location[1], 100, 100, 45, 90);
        //g2d.setColor(Color.black);
        //g2d.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360);
        }
    }

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

        new Timer(200, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //              setLocation((location[0]+1),location[1]);
                repaint();
                System.out.println("repainting");
            }
        }).start();

    }

    public void setLocation(int x, int y){
        //this.location[0] = x;
        //this.location[1] = y;
    }


    public static void main(String[] args){
        JFrame jf=new JFrame();
        jf.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE);
        jf.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
        jf.add(new Test());

        jf.pack();
        jf.setVisible(true);

    }
}

我的原始代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test extends JPanel{

    private int[] location = new int[2]; 

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

        g.setColor(Color.red);
        g.fillArc(location[0], location[1], 100, 100, 45, 90);
        g.setColor(Color.black);
        g.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360);

        new Timer(2000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setLocation((location[0]+50),50);
                repaint();
                System.out.println("repainting");
            }
        }).start();

    }

    public void setLocation(int x, int y){
        this.location[0] = x;
        this.location[1] = y;
    }


    public static void main(String[] args){
        JFrame jf=new JFrame();
        jf.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE);
        jf.setPreferredSize(new Dimension(300,500));
        jf.setLocation(100,100);
        jf.add(new Test());

        jf.pack();
        jf.setVisible(true);
    }
}

编辑:应该包括这个位,第一个评论者是对的。

错误是找不到符号,指的是g2d或g,无论哪个。我认为绘图只能在绘图组件内部进行,而且我必须找到一种方法来包含绘制所有绘图的指令。我想确保我只是做了一些根本错误的事情,尽管这是我第一次使用抽象类和java中的2D绘图。另外,我知道位置[0]等不会按原样运行。让我们忽略它。

底部代码是我想要完成的(至少在开始时),但我尝试使用类似于顶部代码的东西来创建可以独立操作的多个实例。

1 个答案:

答案 0 :(得分:0)

  1. 将计时器移出paintcomponent。
  2. 您已经声明了一个抽象类,它具有一个需要Graphics2D对象能够绘制的绘制方法,它无法访问它。声明一个类只是为了保存两个值(屏幕大小和位置),如果该类也像绘图那样做,那也没什么意义。
  3. 要解决2的问题,您可以让gladiator扩展JComponent,覆盖其paintcomponent并将draw()代码放入其中并添加小组的角斗士作为一个组成部分。

  4. 您也可以执行活动渲染,这意味着您可以获得画布的Graphic2D对象(本例中为面板)并自行控制渲染,而不是依赖于swing。

  5. 由于您正在使用摇摆,我将为您提供您可能打算做的工作示例。如果您有更具体的问题,请发表评论。

    public class Test extends JPanel {
    
    
    public static abstract class graphic extends JComponent {
    
        public Dimension dim = new Dimension(500, 500);
        private int[] loc = new int[] { 250, 250 };
    
        @Override
        @Transient
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    
    
        public int[] getLoc() {
            return loc;
        }
    
        public Dimension getDim() {
            return dim;
        }
    
    }
    
    public static class gladiator extends graphic {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.green);
            g2d.fillArc(getLoc()[0], getLoc()[1], 100, 100, 45, 90);
            g2d.setColor(Color.black);
            g2d.fillArc((getLoc()[0] + 50 - 10), (getLoc()[1] + 50 - 10), 20,
                    20, 0, 360);
        }
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Test canvas = new Test();
        gladiator gladiator = new gladiator();
    
        canvas.add(gladiator);
        frame.getContentPane().add(canvas);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    }
    

    这呈现

    enter image description here