Переместить несколько BufferedImage в Java2D?

Как я могу перетаскивать мышью разные 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);
}

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

class MouseMotionHandler extends MouseMotionAdapter {

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

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


person jonas    schedule 09.04.2010    source источник


Ответы (6)


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

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

person camickr    schedule 09.04.2010

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

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

person dteoh    schedule 09.04.2010
comment
У меня проблемы с JLayeredPane. Мои изображения не будут отображаться. Я прошел учебник солнца. Код выглядит ужасно, размещаю его ниже. - person jonas; 14.04.2010

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

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

person pajton    schedule 09.04.2010
comment
У меня перерисовка глобальная, буду перекрашивать все окно т.е. JPanel, содержащий больше изображений. - person jonas; 09.04.2010

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

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

person trashgod    schedule 09.04.2010

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

  1. один для значений x
  2. один для y-значений
  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);
    }
}

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

person Martijn Courteaux    schedule 09.04.2010

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

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);
person jonas    schedule 14.04.2010