我第一次使用Swing并且遇到了一些问题。我所拥有的是一个分成四个JPanel的JFrame。 JFrame上有一个像这样的
的MouseListener单击一下,如果单击位于左侧栏内,则确定正在选择13个图标中的哪一个。如果点击是在右手“游戏窗格”和已选择一个图标,将其放置在单击的位置。
这是在这里完成的
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
xPos = event.getX();
yPos = event.getY()-25;
//If click is inside tool bar
if(xPos<=75){
if(yPos>-1 && yPos<48)
//First tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=48 && yPos<96)
//Second tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=96 && yPos<144)
//Third tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=144 && yPos<192)
//Fourth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=192 && yPos<240)
//Fifth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=240 && yPos<288)
//Sixth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=288 && yPos<336)
//Seventh tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=336 && yPos<384)
//First NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=384 && yPos<432)
//second NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=432 && yPos<480)
//Third NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=480 && yPos<528)
//First Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=528 && yPos<576)
//Second Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=576 && yPos<=625)
//Third Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
}
//If click is within Game Pane
else if (xPos>75 && yPos<625){
//A tool has been selected
if(image!=null){
placedTool = this.image;
this.image = null;
placeable = true;
}
}
//An image and location on the game pane has been selected
if(placeable && this.image==null){
ImageInfo newImg = new ImageInfo(xPos, yPos, image);
gamePane.additions.add(newImg);
gamePane.repaint();
System.out.println("IMAGE PLACED @ " + xPos + ", " + yPos);
placeable = false;
}
System.out.println("CLICK: (" + xPos + "," + yPos +")");
}
其中imagepath是50x50图标的路径。此部分正常工作,没有错误。但是,gamePane无法正确重新绘制。
gamePane暂时只有一个背景图片。随着组件的添加,它们应该被涂在上面。所有被绘制的都是背景图片。有没有办法使用Graphics.drawImage()来指定Z组件?以下是我对gamePane的paintComponent函数的看法(粗体,因为这是主要问题)
@Override
protected void paintComponent(Graphics g) {
g.drawImage(backgroundImg, 0, 0, null);
for(ImageInfo add : additions){
g.drawImage(add.getImage(), add.getX(), add.getY(), null);
}
}
添加内容如此定义
List additions = new ArrayList();
ImageInfo类只包含图像,x坐标和y坐标
public class ImageInfo {
private int x;
private int y;
private Image image;
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getImage() {
return image;
}
public ImageInfo(int x, int y, Image image) {
super();
this.x = x;
this.y = y;
this.image = image;
}
}
FIXED:
谢谢mKorbel。通过定义mouseClicked方法之外的所有图像
Image tool1 = new ImageIcon(getClass().getResource(toolBar.TOOL1)).getImage();
Image tool2 = new ImageIcon(getClass().getResource(toolBar.TOOL2)).getImage();
Image tool3 = new ImageIcon(getClass().getResource(toolBar.TOOL3)).getImage();
Image tool4 = new ImageIcon(getClass().getResource(toolBar.TOOL4)).getImage();
Image tool5 = new ImageIcon(getClass().getResource(toolBar.TOOL5)).getImage();
Image tool6 = new ImageIcon(getClass().getResource(toolBar.TOOL6)).getImage();
Image tool7 = new ImageIcon(getClass().getResource(toolBar.TOOL7)).getImage();
Image npc1 = new ImageIcon(getClass().getResource(toolBar.NPC1)).getImage();
Image npc2 = new ImageIcon(getClass().getResource(toolBar.NPC2)).getImage();
Image npc3 = new ImageIcon(getClass().getResource(toolBar.NPC3)).getImage();
Image decor1 = new ImageIcon(getClass().getResource(toolBar.DECOR1)).getImage();
Image decor2 = new ImageIcon(getClass().getResource(toolBar.DECOR2)).getImage();
Image decor3 = new ImageIcon(getClass().getResource(toolBar.DECOR3)).getImage();
并执行mouseClicked函数,如
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
xPos = event.getX();
yPos = event.getY()-25;
//If click is inside tool bar
if(xPos<=75){
if(yPos>-1 && yPos<48)
//First tool image
image = tool1;
else if(yPos>=48 && yPos<96)
//Second tool image
image = tool2;
else if(yPos>=96 && yPos<144)
//Third tool image
image = tool3;
else if(yPos>=144 && yPos<192)
//Fourth tool image
image = tool4;
else if(yPos>=192 && yPos<240)
//Fifth tool image
image = tool5;
else if(yPos>=240 && yPos<288)
//Sixth tool image
image = tool6;
else if(yPos>=288 && yPos<336)
//Seventh tool image
image = tool7;
else if(yPos>=336 && yPos<384)
//First NPC image
image = npc1;
else if(yPos>=384 && yPos<432)
//second NPC image
image = npc2;
else if(yPos>=432 && yPos<480)
//Third NPC image
image = npc3;
else if(yPos>=480 && yPos<528)
//First Yard Decoration image
image = decor1;
else if(yPos>=528 && yPos<576)
//Second Yard Decoration image
image = decor2;
else if(yPos>=576 && yPos<=625)
//Third Yard Decoration image
image = decor3;
}
//If click is within Game Pane
else if (xPos>75 && yPos<625){
//A tool has been selected
if(image!=null){
placedTool = this.image;
this.image = null;
placeable = true;
}
}
if(placeable && this.image==null){
GamePiece newImg = new GamePiece(placedTool, xPos, yPos);
gamePane.additions.add(newImg);
gamePane.repaint();
System.out.println("IMAGE PLACED @ " + xPos + ", " + yPos);
placeable = false;
}
System.out.println("CLICK: (" + xPos + "," + yPos +")");
}
通过先前给出的paintComponent方法将图像添加到背景图像的顶部。他们有点偏离位置,但仍然可见。
答案 0 :(得分:2)
只有评论
发布SSCCE短暂的可运行,可编辑的
为什么有yPos = event.getY()-25;
什么逻辑代表integer at -25
将所有ImageIcons
存储在本地变量中,将ImageIcons
存储在任何数组或List
中,如果存在固定逻辑而不是获取坐标,则加载{{ 1}}在image = new ImageIcon(getClass().getResource(
中绘制,在运行时不提供任何paintComponent
FileIO
奠定的JLabel
网格,向GridLayout
添加MouseListener
,从JLabel
更改JLabel.setIcon(myImageIcon)
,其余的逻辑我没有SSCCE 例如
Mouse Event
答案 1 :(得分:0)
这看起来很可疑:
if(placeable && this.image==null){
您未在方法中声明image
,因此它与this.image
相同,因此仅在image == null
时才会运行添加代码。也许你的意思是:
if (placeable && this.image != null) {
(我不知道placeable
的目的,所以我把它保留原样)
答案 2 :(得分:0)
感谢@MadProgrammer提供此代码,他帮我解决了这个问题(意思是他做了所有事情)
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.sound.sampled.*;
import javax.swing.*;
import sun.audio.*;
public class SHR {
public static void main(String[] args) {
new SHR();
}
public SHR() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("To Battle");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ToBattle());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ToBattle extends JPanel {
private BufferedImage image;
private Point drawPoint;
public ToBattle() {
try {
image = ImageIO.read(getClass().getResource("SilverHandRecruit.png"));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
drawPoint = new Point(e.getPoint());
repaint();
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (drawPoint != null) {
g2d.drawImage(image, drawPoint.x - 100, drawPoint.y - 100, this);
}
g2d.dispose();
}
}
}
你可以查看他在这里发布的确切答案: Add image on mouse click? Java applet