Nano Hash - криптовалюты, майнинг, программирование

как переместить несколько объектов в JPanel

Я хочу создать несколько квадратов, которые движутся независимо и одновременно, и я думаю, что наиболее эффективным способом является метод преобразования в Graphics2D, но я не уверен, как заставить его работать для каждого квадрата. Я хочу квадратный объект быть автономным и создавать свои собственные преобразования (преобразования экземпляров). Вот что у меня есть до сих пор.

TransformPanel

import javax.swing.*; 
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class TranformPanel extends JPanel {
    private int[] xcoords = {250,248,253,255,249}; 
    private int[] ycoords = {250,253,249,245,250}; 
    private double randomx = 0; 
    private double randomy = 0;
    public void paintComponent(Graphics g) 
    { 
        super.paintComponent(g); 
        drawTransform(g,randomx,randomy);
    } 
    private void drawTransform(Graphics g,double randomx,double randomy) 
    {  
        Random rn = new Random(); 
        int xnum = rn.nextInt(10)-5; 
        randomx = xnum; 
        int ynum = rn.nextInt(10)-5; 
        randomy = ynum;

        Rectangle rect = new Rectangle(250,250,10,10);  
        AffineTransform transform = new AffineTransform();   
        Graphics2D g2d = (Graphics2D)g;   

        transform.translate(randomx,randomy);
        g2d.draw(transform.createTransformedShape(rect));  

        }
    }

TransformDraw

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.AffineTransform;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class TransformDraw{ 
    private static TranformPanel panel = new TranformPanel();
    public static void main(String[] args) {    
        // Setup our JFrame details 
        JFrame frame = new JFrame();
        frame.setTitle("Transform Polygon Example");
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());   
        frame.setVisible(true);
        frame.add(panel); 
        Scanner input = new Scanner(System.in); 
        for (int i=0;i<10;i++) 
        { 
        try {
            TimeUnit.SECONDS.sleep(1);
            frame.repaint(); 
        } catch (InterruptedException e) {
            e.printStackTrace();
            }
        } 
    } 
}

Спасибо заранее!


  • Создайте класс, который знает, где находится один ящик, используйте его, чтобы нарисовать указанный ящик, когда вам нужно 22.10.2015
  • MadProgrammer: Пожалуйста, уточните это. Как я могу отслеживать местоположение ящика и нужно ли мне создавать объект этого класса для каждого ящика? Кроме того, как мне затем преобразовать его местоположение? 22.10.2015

Ответы:


1

Начните с создания чего-то, что может управлять своим местоположением (и другими свойствами) и что можно «нарисовать».

public interface Box {
    public void update(Dimension size);
    public void paint(Graphics2D g2d);
}

Итак, это довольно просто, все, что он может сделать, это обновить (в пределах заданной области) и нарисовать. Вы можете указать другие свойства (например, ограничивающую рамку) в зависимости от ваших конкретных потребностей.

Далее нам нужна простая реализация, что-то вроде...

public class DefaultBox implements Box {

    private Color color;
    private Rectangle bounds;

    private int xDelta;
    private int yDelta;

    public DefaultBox(Color color, Dimension size) {
        this.color = color;
        bounds = new Rectangle(new Point(0, 0), size);

        xDelta = 1 + (int) (Math.random() * 10);
        yDelta = 1 + (int) (Math.random() * 10);
    }

    @Override
    public void update(Dimension size) {
        bounds.x += xDelta;
        bounds.y += yDelta;

        if (bounds.x < 0) {
            bounds.x = 0;
            xDelta *= -1;
        } else if (bounds.x + bounds.width > size.width) {
            bounds.x = size.width - bounds.width;
            xDelta *= -1;
        }
        if (bounds.y < 0) {
            bounds.y = 0;
            yDelta *= -1;
        } else if (bounds.y + bounds.height > size.height) {
            bounds.y = size.height - bounds.height;
            yDelta *= -1;
        }
    }

    @Override
    public void paint(Graphics2D g2d) {
        g2d.setColor(color);
        g2d.fill(bounds);
    }

}

Теперь это поддерживает простой экземпляр Rectangle, который описывает местоположение и размер объекта, а также поддерживает свойства цвета и его скорости.

Когда вызывается update, он обновляет свое местоположение и выполняет простую проверку границ, чтобы убедиться, что поле остается в указанной области.

Когда вызывается paint, он просто рисует сам себя.

Наконец, нам нужно как-то обновить и раскрасить эти коробки....

public class TestPane extends JPanel {

    private List<Box> boxes;
    private Color[] colors = {Color.RED, Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.WHITE, Color.YELLOW};

    public TestPane() {
        boxes = new ArrayList<>(25);
        for (int index = 0; index < 100; index++) {
            Color color = colors[(int) (Math.random() * colors.length)];
            int width = 10 + (int) (Math.random() * 9);
            int height = 10 + (int) (Math.random() * 9);
            boxes.add(new DefaultBox(color, new Dimension(width, height)));
        }

        Timer timer = new Timer(40, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (Box box : boxes) {
                    box.update(getSize());
                }
                repaint();
            }
        });
        timer.start();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Box box : boxes) {
            Graphics2D g2d = (Graphics2D) g.create();
            box.paint(g2d);
            g2d.dispose();
        }
    }

}

Итак, опять же, это довольно просто. Он поддерживает List из Box, Swing Timer для периодического обновления List из Box, вызывая их метод update. Timer просто вызывает repaint, который (окольным путем) в конечном итоге вызывает paintComponent, который затем просто вызывает paint для каждого экземпляра Box.

100 коробок...

100 коробок

22.10.2015
  • Спасибо за разработку. Я скопировал и вставил код, но он не соответствует параметрам запуска Ecplise. Есть ли решение? 23.10.2015
  • Я понятия не имею, что означает но это не соответствует параметрам запуска Ecplise, я не использую Eclipse. Код отлично скомпилируется и запустится из командной строки, в коде есть особенности 23.10.2015
  • Не беспокойтесь об этом. Я просто глуп и забыл создать объект TestPanel в другом java-файле ›.‹ 23.10.2015
  • Добро пожаловать в мой мир :Р 23.10.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..