2010-04-09 2 views
1

Как я могу использовать различные BufferedImages в Java2D?Переместить несколько BufferedImage в 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); 
} 

Everytime Я переезжаю на изображении я перекрасить() - используя весь экран. Мой MouseMove класс следующим образом

class MouseMotionHandler extends MouseMotionAdapter { 

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

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

ответ

0

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

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

+0

Моя перекраска глобальная, я перекрашу все окно, т.е. JPanel, содержащий больше изображений. – jonas

0

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

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

1

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

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

+0

У меня проблемы с JLayeredPane. Мои изображения не будут отображаться. Я прошел учебник по солнцу. Код выглядит ужасно, размещая его ниже. – jonas

0

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

  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); 
    } 
} 

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

2

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

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

0

Вот код для моей инициализации 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); 
Смежные вопросы