这是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);
}
}
}
答案 0 :(得分:3)
可点击图片
你自己并没有轻松完成这项任务......
您可能需要在电路板上添加MouseListener
。触发mouseClicked
事件时,您需要确定事件发生在哪个单元格中。
最简单的方法是拥有List
或Rectangle
数组,每个代表一个单独的单元格。通过这种方式,您可以查看列表并调用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
延伸,并使用GridLayout
或GridBagLayout
进行布局(这可以解决鼠标点击问题)