当前位置: 首页 > 知识库问答 >
问题:

将图像拖动到swing中的JButton中

方夜洛
2023-03-14

我现在正在进行战舰项目。我创建了两个面板,我将它们放在一个框架中。第一个面板是按钮网格,第二个面板由可拖动的船只图像组成。我想要的只是,当我将图像拖到某个按钮中时,它会出现在该按钮上。换句话说,我只是想通过将图像拖到JButton中来简单地添加图像。这是完整的代码:

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;


public class BattleShip extends JFrame{

public BattleShip() throws IOException {
    this.setResizable(false);
    this.pack();
    JPanel panelLeft = new JPanel();
    JPanel panelRight = new JPanel();
    panelLeft.setSize(500, 650);
    panelRight.setSize(200,650);
    panelRight.setBorder(BorderFactory.createLineBorder(Color.RED, 7));
    panelRight.setBackground(Color.WHITE);
    panelLeft.setLayout(new GridLayout(11,11));
    panelRight.setLayout(null);

    BufferedImage myPicture = ImageIO.read(new File("/home/hikmet/Desktop/595a7960d639a15d096a226d.png"));
    BufferedImage[] resized = new BufferedImage[14];
    for (int i = 0; i < 14; ++i) {
        resized[i] = resize(myPicture, 20, 30);
    }
    JLabel[] img = new JLabel[14];
    for (int i = 0; i < 14; ++i) {
        img[i] = new JLabel((new ImageIcon(resized[i])));
    }
    Dimension size = img[0].getPreferredSize();

    for (int i = 0; i < 14; ++i) {
        panelRight.add(img[i]);
        img[i].setBounds(7 + i * 50, 7, size.width, size.height);
    }


    JButton button[][] = new JButton[11][11];
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            button[i][j] = new JButton();
            panelLeft.add(button[i][j]);
        }
    }


    button[1][0].setText("A"); button[0][1].setText("1");
    button[2][0].setText("B"); button[0][2].setText("2");
    button[3][0].setText("C"); button[0][3].setText("3");
    button[4][0].setText("D"); button[0][4].setText("4");
    button[5][0].setText("E"); button[0][5].setText("5");
    button[6][0].setText("F"); button[0][6].setText("6");
    button[7][0].setText("G"); button[0][7].setText("7");
    button[8][0].setText("H"); button[0][8].setText("8");
    button[9][0].setText("I"); button[0][9].setText("9");
    button[10][0].setText("J"); button[0][10].setText("10");

    for (int i = 0; i < 14; i++) { //applying mouseEvent to each image
        MouseHandler movement = new MouseHandler(img[i]);
    }

    this.setTitle("BattleShip");
    this.setSize(700,700);
    this.setLayout(new GridLayout(2,4));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.getContentPane().add(panelLeft);
    this.getContentPane().add(panelRight);
}
//method for just resizing the size of image
private static BufferedImage resize(BufferedImage myPicture, int height, int width) {
    Image tmp = myPicture.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = resized.createGraphics();
    g2d.drawImage(tmp,0,0,null);
    g2d.dispose();
    return resized;
}
//Class for handling mouseEvents
public class MouseHandler implements MouseMotionListener {
private int x, y;

public MouseHandler(JLabel img){
    img.addMouseMotionListener(this);
}

@Override
public void mouseDragged(MouseEvent mouseEvent) {
      mouseEvent.getComponent().setLocation((mouseEvent.getX()+mouseEvent.getComponent().getX())-x, (mouseEvent.getY()+mouseEvent.getComponent().getY())-y);
}

@Override
public void mouseMoved(MouseEvent mouseEvent) {
    x = mouseEvent.getX();
    y = mouseEvent.getY();
  }
}
//Main class
public class Main {
public static void main(String[] args) throws IOException {
    new BattleShip();
  }
}

希望有人能帮助我:)

共有1个答案

张伯寅
2023-03-14

使用< code>TransferHandler类时,可以指定要拖动的属性:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DragIcon extends JPanel
{
    public DragIcon()
    {
        setLayout( new BorderLayout(40, 20) );

        TransferHandler iconHandler = new TransferHandler( "icon" );
//      TransferHandler iconHandler = new TransferHandler( "text" );
        MouseListener dragListener = new DragMouseAdapter();

        JLabel dragLabel = new JLabel("Drag");
        dragLabel.setTransferHandler( iconHandler );
        dragLabel.addMouseListener(dragListener);
        dragLabel.setIcon( new ImageIcon("copy16.gif") );
        dragLabel.setHorizontalAlignment(JLabel.CENTER);
        add(dragLabel, BorderLayout.PAGE_START);


        JLabel label = new JLabel("Label");
        label.setTransferHandler( iconHandler );
        add(label, BorderLayout.LINE_START);

        JButton button = new JButton("Button");
        button.setTransferHandler( iconHandler );
        add(button, BorderLayout.LINE_END);
    }

    private class DragMouseAdapter extends MouseAdapter
    {
        public void mousePressed(MouseEvent e)
        {
            JComponent c = (JComponent)e.getSource();
            TransferHandler handler = c.getTransferHandler();
            handler.exportAsDrag(c, e, TransferHandler.COPY);
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Drag Icon");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new DragIcon());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
 类似资料:
  • 我有一个代码,其中我必须从我的桌面拖动两个图像,并把它放在两个可拖动按钮的框架。按钮已经做在框架上了。但是在拖动图像时,只能拖动到一个按钮上。图像不会被拖到另一个。我创建了一个< code>DragListener类,其中拖动方法占主导地位,还创建了一个主类< code > draginiallistener ,其中我传递了类< code>DragButton的对象,这样就创建了两个可拖动的按钮。

  • 我在互联网上搜索了如何将JButtons拖放到对象的示例,但我无法使其工作。 我的程序所做的是,当我单击一个按钮时,对象更新了一个字段(使用selectedobject.setField())。我希望能够通过拖动JButton而不是单击来做到这一点。 我该怎么做?我找到了这个,并试图输入我的代码: 我从这里参加了ImageHandler课程。

  • 问题内容: 说我有一个和一个。单击按钮后,我想显示动画()图像。而另一个事件(例如)停止在中显示动画。我应该怎么办? 问题答案: 在中显示第一个图像(动画帧)。当用户单击按钮时,启动一个Swing ,它将标签的图标更改为下一帧,并在显示所有帧后循环播放。当用户再次单击该按钮时,停止动画。

  • 问题内容: 如何在Swing中使用文本上方的图标创建JButton? 问题答案: 只是这样做:

  • 我有一个jqueryui可拖动的图像和一个包含text/html且contentEditable=true的jqueryui可拖放的div。 我希望能够将图像拖动到contentEditable文本上,当我将其拖放时,我希望能够将图像拖放到该文本/字符位置。 我已经找到了很多方法来做到这一点,如果我点击或选择可编辑的文本,然后使用选定的文本范围拖动图像,但当我只是拖动图像并放下它时,没有选择文本。

  • 好的,我需要一个功能,我需要能够在图像本身的框架内正确定位图像。 正如您在图像中看到的,图像容器的大小是固定的,如果图像大于框架本身,我需要能够在框架内重新定位图像。我尝试用矩形剪切图像并将图像定位在矩形内,但剪辑会创建一个等于矩形大小的新图像,因此到目前为止还没有成功。类中是否有任何属性可以让我们移动图像位置?所以我找不到任何属性。非常感谢任何帮助。谢谢。