如何使图像可以点击其他问题

时间:2012-10-09 07:53:28

标签: java image swing user-interface clickable

这是Sudoku.java 这是主要的课程。 Reminder保持时间,SudokuBoardDisplay显示棋盘并绘制图像。处理逻辑的人是SudokuModel

如何使图像可点击并执行某些操作。 如何将剩余时间显示为JLabel ....?

我使用的是文本字段,但是文本字段不是行col和val的容器,我想使用图像,,,当点击图像时,框架会弹出9个按钮,其值为1当用户选择时,点击的图像将变为按钮所具有的值。

我以这种方式显示图像 我怎样才能让它可点击并做点什么?

private void drawCellValues(Graphics g){
Image bufferedImage;
for(int i=0;i<9;i++) {
    int y=(i+1)*50-15;
    for(int j=0;j<9;j++){
        if(_model.getValue(i,j)!=10){
            int x=j*50+15;
            String path="/images/"+_model.getValue(i,j)+".png";
            //these lines of code should identify if the cell is editable or not, but unfortunately. _solve.getBoard().charAt(i+(j*10))=='0' produces an error
            //String patht="/images/"+_model.getVal(i,j)+"t.png";
            //if(_solve.getBoard().charAt(i+(j*10))=='0'){
            //    bufferedImage=new ImageIcon(this.getClass().getResource(patht)).getImage();
            //}
            //else{  
                bufferedImage=new ImageIcon(this.getClass().getResource(path)).getImage();  
            //}
            g.drawImage(bufferedImage,x-14,y-34,this);
        }
    }
}

}

这是我的'提醒' 如何在我的其他类中显示延长JFrame的剩余时间?

import java.util.*;
import javax.swing.JOptionPane;
public class Reminder{
Timer timer;
public Reminder(int sec){
timer=new Timer();
timer.schedule(new stop(),sec*1000);
}
class stop extends TimerTask{
    @Override
    public void run(){
        JOptionPane.showMessageDialog(null, "TIME IS UP!!! YOU FAIL!!");
        timer.cancel();
        System.exit(0);
    }
}
}

1 个答案:

答案 0 :(得分:3)

可点击图片

你自己并没有轻松完成这项任务......

您可能需要在电路板上添加MouseListener。触发mouseClicked事件时,您需要确定事件发生在哪个单元格中。

最简单的方法是拥有ListRectangle数组,每个代表一个单独的单元格。通过这种方式,您可以查看列表并调用Rectangle#contains(Point)以确定鼠标是否落在该单元格的范围内。

否则你会遇到类似......的事情。

int row = -1;
int col = -1;

for (int i = 0; i < 9; i++) {
    int yPos = (i + 1) * 50 - 15;
    if (y >= yPos && y <= yPos + 50) {
        row = i;
        break;
    }
}
for (int j = 0; j < 9; j++) {
    int xPos = j * 50 + 15;
    if (x >= xPos && x <= xPos + 50) {
        col = j;
        break;
    }
}

(你必须对此进行调试才能确定,但​​我认为从我能说出的代码来看是正确的)

剩余计时器

您已经使用java.util.Timer这很酷,但我会使用javax.swing.Timer代替。主要原因是它在Event Dispatching Thread中被触发。

Timer countDown = new Timer(1000, new Watcher(gameTime));
countDown.setRepeats(true);
countDown.setCoalesce(true);
countDown.start();

每次计时器滴答时,您都会减少UI组件的时间......

public class Watcher implements ActionListener {
    private int length;
    private int ticks = 0;
    public Watcher(int time) {
        length = time;
    }

    public void actionPerformed(ActionEvent evt) {
        tick++;
        int timeRemaining = length - (tick * 1000);
        if (timeRemaining <= 0) {
            // Game over
        } else {
            labelShowingTimeRemaining.setText(Integer.toString((int)Math.round(timeRemaining / 1000)));
        }
    }
}

<强>反馈

我不会这样做......

bufferedImage=new ImageIcon(this.getClass().getResource(path)).getImage();  

在每个涂装周期中。这可能非常耗时,更不用说会耗费合理的内存量。

我会创建一个Cell类。

  • 每个单元格将分配给特定网格。
  • 每个人都会参考游戏模型
  • 每个单元格都是paintable
  • 每个单元格都会知道它的绘制位置。
  • 如果我正在编写它,每个单元格将从JPanel延伸,并使用GridLayoutGridBagLayout进行布局(这可以解决鼠标点击问题)