Переместить несколько BufferedImage в Java2D? - PullRequest
1 голос
/ 09 апреля 2010

Как я могу mousedrag различных BufferedImages в Java2D?

Например, если у меня есть десять или более изображений, как я могу переместить те изображения, над которыми находится моя мышь?

Теперь я импортирую BufferedImage с

BufferedImage img = new BufferdImage(new File("filename"));

И я рисую это с Graphics2D с

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    g2d.drawImage(img, x1, y1, null);
    g2d.drawImage(img2, x2, y2,null);
}

Каждый раз, когда я перемещаюсь по изображению, я перерисовываю () - весь экран. Мой класс перемещения мыши выглядит следующим образом

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        x1 = e.getX() - (img.getWidth() / 2);
        y1 = e.getY() - (img.getHeight() / 2);
        repaint();
    }
}

С помощью этого метода я могу «перетащить» одну картинку, но что делать, если я буду перетаскивать более индивидуально?

Ответы [ 6 ]

2 голосов
/ 09 апреля 2010

Используйте BufferedImage для создания ImageIcon, который вы используете для создания JLabel. Затем вы добавляете JLabel на панель, которая использует нулевой макет. Для этого не требуется настраиваемый код рисования.

Теперь, если вы хотите перетащить метку, вы можете использовать Component Mover .

1 голос
/ 09 апреля 2010

Вы можете попробовать создать пользовательский компонент, содержащий только одно изображение.Наряду с вашим кодом для рисования и обработки движений мыши, компонент переопределяет метод contains, поэтому он возвращает true, только если координаты находятся внутри изображения.

Эти компоненты затем складываются в JLayeredPane, (надеюсь, только перемещаясь).изображения, над которыми находится мышь.

0 голосов
/ 14 апреля 2010

Вот код для моей инициализации JLayeredPane. Моя проблема в том, что мои изображения не отображаются ...

layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new java.awt.Dimension(500, 410));
layeredPane.setBorder(javax.swing.BorderFactory.createTitledBorder(
                                "Center deck"));
for(BufferedImage imgs : images){
   JLabel label = new JLabel(new ImageIcon(imgs));
   layeredPane.add(label, JLayeredPane.DEFAULT_LAYER);
}
add(layeredPane);
0 голосов
/ 09 апреля 2010

Я должен сделать массивы деревьев:

  1. один для значений х
  2. один для значений у
  3. один для BufferedImages

Итак, как-то так:

int[] xValues = new int[10];
int[] yValues = new int[10];
BufferedImage[] imgs = new BufferedImage[10];

Тогда

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        for (int i = 0; i < 10; i++)
        {
            xValues[i] = e.getX() - (imgs[i].getWidth() / 2);
            yValues[i] = e.getY() - (imgs[i].getHeight() / 2);
        }
        repaint();
    }
}

Тогда нарисуйте их так:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    for (int i = 0; i < 10; i++)
    {
        g2d.drawImage(imgs[i], xValues[i], yValues[i], null);
    }
}

Я думаю, что-то вроде этого - то, что вам нужно.

0 голосов
/ 09 апреля 2010

Вот простой пример , в котором реализовано перетаскивание для одного или нескольких вариантов выбора. Объект Node будет примерно соответствовать вашему объекту Card.

Добавление: также рассматривается Схема перекрытия , упомянутая в этом ответе на связанный вопрос. Вместо List<Node> ваша программа будет управлять List<Card>, где каждый Card - это JLabel с изображением карты.

0 голосов
/ 09 апреля 2010

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

Если вы опубликуете больше кода - особенно компонента, в котором вы показываете свои изображения - я смогу углубиться в детали.

...