如何在Java2D中mousedrag不同的BufferedImages?
例如,如果我有十张或更多图像,我该如何移动鼠标悬停的图像?
现在我用
导入BufferedImageBufferedImage 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();
}
}
使用这种方法,我可以“拖动”一张图片,但是当我单独拖动时该怎么办?
答案 0 :(得分:2)
使用BufferedImage创建用于创建JLabel的ImageIcon。然后将JLabel添加到使用空布局的面板。这样做不需要自定义绘画代码。
现在,如果您想拖动标签,可以使用Component Mover。
答案 1 :(得分:1)
您可以尝试制作仅包含单个图像的自定义组件。除了绘画和鼠标运动处理代码外,该组件还会覆盖contains方法,以便仅当坐标位于图像中时才返回true。
然后将这些组件堆叠在JLayeredPane中(希望)只移动鼠标位于其上的图像。
答案 2 :(得分:0)
根据你的要求,我认为你当前的重画逻辑是全球性的。您需要将它应用于您拥有的每个图像。因此,如果您将JPanel
附加MouseMotionListener
中的每个图片显示到每个此类面板,并在JPanel
中进行此逻辑。
如果您发布更多代码 - 尤其是您展示图片的组件 - 我将能够详细介绍。
答案 3 :(得分:0)
这是一个简单的example,可以实现单次或多次选择的拖动。对象Node
将大致对应于您的对象Card
。
附录:还考虑了Overlap Layout中提到的answer相关问题。您的计划将管理List<Node>
,而不是List<Card>
,其中每个Card
都是JLabel
,其中包含卡片图片。
答案 4 :(得分:0)
我应该制作树阵列:
所以,像这样:
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);
}
}
我认为这就是你所需要的。
答案 5 :(得分:0)
这是我的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);