首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >graphics2D列表

graphics2D列表
EN

Stack Overflow用户
提问于 2016-10-17 21:16:06
回答 1查看 539关注 0票数 2

下面的代码怎么会起作用呢?我想每隔200毫秒向ArrayList添加新的卵形,并逐一显示并运行它们。当我运行一个粒子s.runner()时,它工作得很好;但是它似乎并不能运行我的所有粒子。

主要:

代码语言:javascript
复制
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.Timer;

public class ExempelGraphics extends JFrame implements ActionListener {
    Timer t;
    private int inc = 0;
    ArrayList<Surface> particle = new ArrayList<>();
    Surface s;

    public ExempelGraphics() {
        t = new Timer(10, this);
        t.start();
        s = new Surface(10, 10);
        initUI();
    }

    private void initUI() {
        add(s);
        setSize(350, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {
//        s.runner();
        // add
        if (inc++ % 20 == 0) {
            particle.add(new Surface(10, 10));
        }

        // display
        for (int i = 0; i < particle.size(); i++) {
            Surface p = particle.get(i);
            p.runner();
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ExempelGraphics ex = new ExempelGraphics();
                ex.setVisible(true);
            }
        });
    }
}

图形:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class Surface extends JPanel {
    private int locX = 0;
    private int locY = 0;

    public Surface(int locX, int locY) {
        this.locX = locX;
        this.locY = locY;
    }

    public void runner() {
        locX = locX + 1;
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fillOval(locX, locY, 10, 10);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-17 21:20:14

我觉得你的程序结构坏了。这里应该只有一个JPanel进行绘图,它的paintComponent被重写,而您的JPanel类应该是一个逻辑类,而不是一个组件类--换句话说,不要让它扩展JPanel,并给它一个绘制椭圆的public void draw(Graphics g)方法。然后让绘图JPanel保存这些曲面的ArrayList,并在主JPanel的paintComponent方法中迭代这些曲面,调用每个曲面的绘图方法。

此外,您的计时器的延迟是不现实的,太小。15将更加现实。

另外,不要从表面调用repaint(),因为这会产生太多不必要的重绘调用。相反,在调用所有Surface对象上的runner方法之后,从计时器的ActionListener中调用它。

还请注意,每次以默认方式向JFrame的contentPane添加组件时,都会掩盖之前添加的组件。如果您按照我上面的建议,这并不是一个问题,因为您只需要将单个JPanel添加到其中。

例如:

代码语言:javascript
复制
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class ExampleGraphics2 extends JPanel {
    private static final int PREF_W = 650;
    private static final int PREF_H = 500;
    private static final int TIMER_DELAY = 20;
    private List<Surface> surfaces = new ArrayList<>();

    public ExampleGraphics2() {
        new Timer(TIMER_DELAY, new TimerListener()).start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (Surface surface : surfaces) {
            surface.draw(g);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private class TimerListener implements ActionListener {
        private int index = 0;

        @Override
        public void actionPerformed(ActionEvent e) {
            index++;
            index %= 20;
            if (index == 0) {
                surfaces.add(new Surface(10, 10));
            }

            for (Surface surface : surfaces) {
                surface.runner();
            }
            repaint();
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Example Graphics 2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ExampleGraphics2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

代码语言:javascript
复制
package foo1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class Surface {
    private int locX = 0;
    private int locY = 0;

    public Surface(int locX, int locY) {
        this.locX = locX;
        this.locY = locY;
    }

    public void runner() {
        locX = locX + 1;
    }

    public void draw(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fillOval(locX, locY, 10, 10);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40095785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档