2010-04-09 20 views
1

如何在Java2D中使用不同的BufferedImages?在Java2D中移動多個BufferedImage?

例如,如果我有10張或更多的圖像,我該如何移動鼠標結束的圖像?

現在我導入的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(); 
    } 
} 

用這種方法我能「拖」一個畫面,而是做什麼時,我會拖累更多的獨立?

回答

0

從你的問題我想你現在的重繪邏輯是全球性的。您需要將其應用於您擁有的每張圖片。因此,如果您例如在每個這樣的面板上顯示JPanel附加MouseMotionListener中的每個圖像,並使該邏輯發生在JPanel中。

如果您發佈更多的代碼 - 特別是您展示圖片的組件 - 我將能夠進入更多細節。

+0

我的重新粉刷是全球性的,我會重新繪製整個窗口,即。包含更多圖像的JPanel。 – jonas 2010-04-09 14:54:35

0

下面是一個簡單的example,它實現了單個或多個選擇的拖動。對象Node將大致對應於您的對象Card

附錄:同時考慮到在answer中提到的Overlap Layout到相關問題。代替List<Node>,您的程序將管理List<Card>,其中每個Card是具有卡片圖像的JLabel

1

您可以嘗試製作僅包含單個圖像的自定義組件。除了繪畫和鼠標移動處理代碼外,組件還會覆蓋contains方法,以便只有在座標位於圖像中時才返回true。

然後將這些組件堆疊在JLayeredPane中(希望)只移動鼠標所在的圖像。

+0

JLayeredPane出現了一些問題。我的圖片不會顯示出來。我已經閱讀了sun的教程。 代碼看起來很糟糕,在下面張貼它。 – jonas 2010-04-14 11:31:09

0

我應該做的樹陣:

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

我覺得這樣的事情是你所需要的。

2

使用BufferedImage創建一個您用來創建JLabel的ImageIcon。然後,將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);