Пользовательская позиция графики с JFrame / JPanel / Netbeans - PullRequest
2 голосов
/ 23 февраля 2012

Я использую графический интерфейс Netbeans для создания графического интерфейса, и мне интересно создать квадрат 300 на 300 с маленькой точкой, указывающей положение в этом квадрате. JPanel выглядел как хорошее место для старта, и он дает мне координаты, которые мне нужны, чтобы указать положение, в котором нужно нарисовать точку; но я не знаю, как создать такую ​​подвижную точку в рамках, в котором я работаю.

Я понимаю, что одним из решений было бы отключить менеджер раскладки, но это не очень хорошее решение. Я ценю любые рекомендации или ссылки на полезные ресурсы: -)

1 Ответ

3 голосов
/ 23 февраля 2012

Может быть это

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.*;
import java.util.ArrayList;

public class PathIteratorTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame("FlatteningPathIterator test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Shape s=new Ellipse2D.Float(10,10,200,100);
        PaintPanel app = new PaintPanel(s);
        JScrollPane scroll = new JScrollPane(app);
        frame.getContentPane().add(scroll);

        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    static class PaintPanel extends JPanel {
        FlatteningPathIterator iter;
        ArrayList<Point> points;
        int index=0;
        public PaintPanel(Shape s) {
            iter=new FlatteningPathIterator(s.getPathIterator(new AffineTransform()), 1);
            points=new ArrayList<Point>();
            float[] coords=new float[6];
            while (!iter.isDone()) {
                iter.currentSegment(coords);
                int x=(int)coords[0];
                int y=(int)coords[1];
                points.add(new Point(x,y));
                iter.next();
            }
            Timer timer=new Timer(50, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    index++;
                    if (index>=points.size()) {
                        index=0;
                    }
                    repaint();
                }
            });
            timer.start();
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.blue);
            Point p=points.get(index);
            g.fillOval(p.x, p.y, 5,5);
        }
    }
}
...