我现在正在进行战舰项目。我创建了两个面板,我将它们放在一个框架中。第一个面板是按钮网格,第二个面板由可拖动的船只图像组成。我想要的只是,当我将图像拖到某个按钮中时,它会出现在该按钮上。换句话说,我只是想通过将图像拖到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();
}
}
希望有人能帮助我:)
使用< 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文本上,当我将其拖放时,我希望能够将图像拖放到该文本/字符位置。 我已经找到了很多方法来做到这一点,如果我点击或选择可编辑的文本,然后使用选定的文本范围拖动图像,但当我只是拖动图像并放下它时,没有选择文本。
好的,我需要一个功能,我需要能够在图像本身的框架内正确定位图像。 正如您在图像中看到的,图像容器的大小是固定的,如果图像大于框架本身,我需要能够在框架内重新定位图像。我尝试用矩形剪切图像并将图像定位在矩形内,但剪辑会创建一个等于矩形大小的新图像,因此到目前为止还没有成功。类中是否有任何属性可以让我们移动图像位置?所以我找不到任何属性。非常感谢任何帮助。谢谢。