- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个单元格对象的二维数组,其中包含其“tileCode”的字符串变量,当我使用键盘设置 Activity 图 block 代码,然后单击二维数组中所需的单元格时,它应该更改该单元格的tileCode到当前 Activity 图 block 。但是,当我单击该图 block 后,它立即切换回之前的图 block 代码和图像。
默认情况下,每个图 block 都设置为一个地板。
public static JFrame frame = new JFrame("Tool");
public static Panel panel;
public Image wall, floor;
public int rows = 50;
public int cols = 50;
public int xCoor = 20;
public int yCoor = 20;
String activeKey = "f";
Image activeImage = floor;
//Arrays
Rectangle[][] recs = new Rectangle[rows][cols];
Cell[][] cells = new Cell[rows][cols];
public Set <Integer> keysDown = new HashSet<>();
public LevelDesignTool() {
loadImages();
panel = new Panel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1400, 1100);
frame.setFocusable(true);
frame.requestFocus();
frame.setVisible(true);
frame.getContentPane().add(panel);
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(this);
addMouseListener(this);
myThread thread = new myThread();
thread.start();
}
class Panel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2D = (Graphics2D)g;
//Loading array of Tile Types
ArrayList<String> TileTypes = new ArrayList<>();
try {
Scanner TileFileScanner = new Scanner(new File("TileTypes"));
while(TileFileScanner.hasNext()) {
TileTypes.add(TileFileScanner.nextLine());
}
}
catch(FileNotFoundException e) {
System.err.println("Tile Type file not found.");
}
g.setFont(new Font("Italic",Font.PLAIN, 25));
g.drawString("Press Enter to save to file.", 1050, 50);
//Tile Type key on the rigt side of the screen
int y = 550;
for(int i = 0; i < TileTypes.size(); i++) {
g.drawString(TileTypes.get(i), 1050, y);
y += 30;
}
//Creating 2D array of Rectangles
xCoor = 20;
for(int r = 0; r < rows; r++) {
yCoor = 20;
for(int c = 0; c < cols; c++) {
recs[r][c] = new Rectangle(xCoor, yCoor, 18, 18);
yCoor += 19;
}
xCoor += 19;
}
//Creating 2D array of cells
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
cells[r][c] = new Cell(recs[r][c], "f", activeImage);
xCoor += 21;
}
xCoor = 0;
yCoor += 21;
}
//Drawing cells
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
g.fillRect((int)cells[r][c].r.getX(), (int)cells[r][c].r.getY(), (int)cells[r][c].r.getWidth(), (int)cells[r][c].r.getHeight());
g.setColor(Color.BLACK);
}
}
//Drawing the images stored in each cell object
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
cells[r][c].image = floor;
g.drawImage(cells[r][c].getImage(), cells[r][c].getX(), cells[r][c].getY(), this);
}
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
if (cells[r][c].getRect().contains(e.getX(), e.getY())) {
cells[r][c].tileCode = activeKey;
cells[r][c].image = activeImage;
//System.out.println("click registered");
}
}
}
}
});
}
}
//Must have these implemeted because they are from an interface
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
public void update() throws Exception {
//System.out.println(cells[0][0].getTileCode());
//System.out.println(activeKey);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getID() == KeyEvent.KEY_PRESSED){
keysDown.add(event.getKeyCode());
if(event.getKeyCode() == KeyEvent.VK_F) {
activeKey = "f";
activeImage = floor;
}
if(event.getKeyCode() == KeyEvent.VK_E) {
activeKey = "e";
}
if(event.getKeyCode() == KeyEvent.VK_W) {
activeKey = "w";
activeImage = wall;
}
}
if(event.getID() == KeyEvent.KEY_RELEASED)
keysDown.remove(event.getKeyCode());
return false;
}
class myThread extends Thread {
public void run() {
while(true) {
try {
Thread.sleep(15);
frame.repaint();
update(); //update any game state changes for the next frame
}
catch(Exception e) {
System.out.println(e);
}
}
}
}
private void loadImages() {
floor = new ImageIcon("images/Floor.png").getImage();
wall = new ImageIcon("images/Wall.png").getImage();
}
//Runs code
public static void main(String[] args) {
new LevelDesignTool();
}
}
单击某个单元格后,其图像应更改为 Activity 图像,并且图 block 代码应更改为 Activity 图 block 代码。
最佳答案
问题是您在每次调用paintComponent时都初始化数据(并添加新的mouseListener)。每次重新绘制时,都会将所有数据重置为“floor”,这会覆盖您在鼠标监听器中所做的任何更改。另外,请注意,在“绘制单元格”循环中,您在绘制图像之前将图像重置为地板 (cells[r][c].image = Floor;
)。这将再次重置您在鼠标监听器中设置的数据。
解决方案是将 mouseListener 和初始化代码移至 Panel 的构造函数中,如下所示:
class Panel extends JPanel {
ArrayList<String> TileTypes = new ArrayList<String>();
public Panel() {
//Loading array of Tile Types
try {
Scanner TileFileScanner = new Scanner(new File("TileTypes"));
while(TileFileScanner.hasNext()) {
TileTypes.add(TileFileScanner.nextLine());
}
} catch(FileNotFoundException e) {
System.err.println("Tile Type file not found.");
}
//Creating 2D array of Rectangles
xCoor = 20;
for(int r = 0; r < rows; r++) {
yCoor = 20;
for(int c = 0; c < cols; c++) {
recs[r][c] = new Rectangle(xCoor, yCoor, 18, 18);
yCoor += 19;
}
xCoor += 19;
}
//Creating 2D array of cells
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
cells[r][c] = new Cell(recs[r][c], "f", activeImage);
cells[r][c].image = floor;
xCoor += 21;
}
xCoor = 0;
yCoor += 21;
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
if (cells[r][c].getRect().contains(e.getX(), e.getY())) {
cells[r][c].tileCode = activeKey;
cells[r][c].image = activeImage;
//System.out.println("click registered");
}
}
}
}
});
}
public void paintComponent(Graphics g) {
Graphics2D g2D = (Graphics2D)g;
g.setFont(new Font("Italic",Font.PLAIN, 25));
g.drawString("Press Enter to save to file.", 1050, 50);
//Tile Type key on the rigt side of the screen
int y = 550;
for(int i = 0; i < TileTypes.size(); i++) {
g.drawString(TileTypes.get(i), 1050, y);
y += 30;
}
//Drawing cells
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
g.fillRect((int)cells[r][c].r.getX(), (int)cells[r][c].r.getY(),
(int)cells[r][c].r.getWidth(), (int)cells[r][c].r.getHeight());
g.setColor(Color.BLACK);
}
}
//Drawing the images stored in each cell object
for(int r = 0; r < rows; r++) {
for(int c = 0; c < cols; c++) {
g.drawImage(cells[r][c].getImage(), cells[r][c].getX(), cells[r][c].getY(), this);
}
}
}
}
另外,这不是您问题的一部分,但您正在丢弃线程中的中断异常。改为这样做:
public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(15);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
关于Java - 为什么 mouseClicked 方法在执行完成后不会永久重置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655837/
到目前为止,我的 mouseClicked() 方法使用 getX() 和 getY()。查看用户是否单击肺部图片。然而,通过使用 x 和 y,成功的“区域”是一个盒子,而不是肺部的形状。因此,单击肺
private JTable getTRent() { if (tRent == null) { ... tRent.addMouseListener(new MouseAda
经过 2 个小时的搜索,我真的找不到为什么我的代码不起作用,所以我想知道你是否可以提供帮助。 当我按下按钮时,我想看到的只是“点击”。我的类 MouseInput 实现了 MouseListener
所以我本质上正在开发一个交易或不交易的java游戏,现在我试图让图像图标在用户点击的地方消失。因此,我有一个 6 x 6 的“金属公文包”(casesArray) 图像图标数组,但无论用户单击何处,只
这是我第一次用 Java 编写游戏。我正在制作一款角色扮演游戏。我已经成功地使用 KeyListener 函数用箭头键移动我的角色。但是,当在窗口中单击鼠标时,我一直试图将角色移向鼠标。我已经发现它可
我正在尝试编写一个寻路迷宫算法,以尝试将 A* 实现到 JPanel 接口(interface)中。代码如下。如您所见,我使用随机数生成器随机生成迷宫方 block 的颜色。以下是源代码的基本实现:
这似乎应该有效,但实际上无效。我在 SWITCH 语句上设置了调试停止。此事件仅在左键单击时触发。没有任何反应,方法不会在中键或右键单击时触发。有任何想法吗?附言我已经尝试过使用 MouseUp 和
我有一个单元格对象的二维数组,其中包含其“tileCode”的字符串变量,当我使用键盘设置 Activity 图 block 代码,然后单击二维数组中所需的单元格时,它应该更改该单元格的tileCod
我正在制作一个 GUI 配对猜谜游戏,带有 9x12 面板,每个面板中保存一个随机数。我已经做到了,当您将鼠标悬停在每个单独的面板上时,它会从红色变为黄色,并在鼠标离开面板区域后变回红色。我现在的问题
public class ControllerGui { private JFrame frame; private JTextField textField; private JTextField
我正在扩展 JButton 类并使用 ImageIcon 作为按钮背景。我还添加了一个 mouseListener,以便当鼠标悬停在按钮上或按下按钮时可以更改按钮的图像。这一切都工作正常,但问题是,当
我正在使用 java3D 并希望将单击的项目的 ID 传递给我的类。但它没有成功。它可以打印 ID,也可以将其传递给字符串文本。但它在 game.btClicked(text); 行中显示 nullP
我尝试制作一个程序,每次单击时都会创建一个视觉效果,但它不起作用,因此我将代码精简为不起作用的示例。起初我认为问题是我没有绘图函数,因此处理没有搜索事件,但是当我添加 println 时它仍然没有触发
我想知道是否有一个选项可以使用java机器人类来单击像素之间。我在网上没有找到任何相关信息。 示例:robot.mousePress(float x, float y); 最佳答案 我认为您不能在 m
有没有一种方法可以以秒或毫秒为单位计算单击鼠标按钮和释放鼠标按钮之间的时间。 我使用了此功能,但不适合我 public void mouseClicked (MouseEvent me) { l
所以我对如何从另一个组件的 mouseClicked 方法访问其他屏幕组件/变量(我不知道如何调用它们,但是像文本框、按钮等)有点困惑。例如,假设单击一个按钮后,另一个按钮就会被禁用。我的意思是,在这
我使用 JPanel 为 Game Of Life 制作 GUI,我的类扩展了 JFrame 并实现了 MouseListener,但是当我单击 JLabel 时,MouseListener 只工作一
我正在编写一个程序,当我单击时,它将移动一个矩形。我有一个函数 move(),它可以将矩形向下移动 100 倍一个像素,并使用 pause(20) 在每次移动之间等待 20 毫秒。当我在 run()
我在窗体上有一个带有 MouseClick 事件的面板。问题是每次单击面板时都不会触发 MouseClick 事件。它跳过点击时非常随机。 我想我可以改用 MouseDown 和 MouseUp 事件
你好我读过可以像方法一样引发事件。嗯,它适用于我的自定义事件(我创建了一个委托(delegate),事件,我可以通过调用它来引发事件)。但是,我无法手动引发 MouseClick 等事件,它一直说它必
我是一名优秀的程序员,十分优秀!