📄 gamepanel.java
字号:
break; case 2: c = markColorB; square[kout[0]][kout[1]].mark(c); break; case 3: c = markColorC; square[kout[0]][kout[1]].mark(c); break; case 4: c = markColorD; square[kout[0]][kout[1]].mark(c); break; default: square[kout[0]][kout[1]].unmark(); } } /** * <code>unmarkSquare</code> * <p>Unmarks a square<p> */ public void unmarkSquare(int index){ int[] kout = new int[2]; kout = Convert.indexToKoutia(index); square[kout[0]][kout[1]].unmark(); } public void unmarkAll(){ for(int i = 0; i < 9; i++) for(int j = 0; j < 9; j++) square[i][j].unmark(); } // SETS public void setHighlightColor(Color hc){highlightColor = hc;} public void setErrorBackColor(Color col){errorBackColor = col;} public void setFixedBackColor(Color col){fixedBackColor = col;} public void setShowTrace(boolean state){showTrace = state;} public void setShowToolTip(boolean state){showToolTip = state;} public void setMarkColorA(Color col){markColorA = col;} public void setMarkColorB(Color col){markColorB = col;} public void setMarkColorC(Color col){markColorC = col;} public void setMarkColorD(Color col){markColorD = col;} public void setPanelBackColor(Color col){ panelBackColor = col; setBackground(col); } public void setSquareBackColor(Color col){ squareBackColor = col; for(int i = 0; i < 9; i++) for(int j = 0; j < 9; j++) if(!square[i][j].isFixed()) square[i][j].setDefaultBackgroundColor(squareBackColor); } // // METHODS FOR EVENT HANDLING // /** * <code>bKeyPressed</code> * <p>1)Handles the event that occurs when the user tries to * enter a value on a cell of the board.</p> * <p>2)Handles keybord delete</p> * <p>3)Handles keyboard arrows events</p> * Checks if the entered value is valid and if so submits it * @param evt */ private void bKeyPressed(KeyEvent evt){ MSquare ob = (MSquare) evt.getSource(); char a; int k,l; int index; String name = ob.getName(); k = Integer.valueOf(String.valueOf(name.charAt(1))); l = Integer.valueOf(String.valueOf(name.charAt(2))); a = evt.getKeyChar(); index = Convert.koutiaToIndex(k, l); if(Character.isDigit(a) && a != '0' && !game.isFixed(Convert.koutiaToIndex(k,l))){ String num_str = String.valueOf(evt.getKeyChar()); if(game.canIAdd(Integer.valueOf(num_str), index)){ addToGame(Integer.valueOf(num_str), index); ob.setText(num_str); ob.setForeground(Color.BLACK); if(game.checkFull()) doParty(); else setBackground(panelBackColor); }else{ ob.setText(num_str); ob.setForeground(Color.RED); handleError(index); } // 127 is the value of key DELETE }else if(a == 127 && !game.isFixed(Convert.koutiaToIndex(k,l))){ removeFromGame(index, ob); } // for handling key arrows int[] kout = new int[2]; kout[0] = k; kout[1] = l; int[] kart = Convert.koutiaToKartes(k, l); index = Convert.koutiaToIndex(k, l); switch(evt.getKeyCode()){ case KeyEvent.VK_UP: if((kart[0] - 1) >= 0){ kout = Convert.kartesToKoutia(kart[0] - 1, kart[1]); try{ Robot r = new Robot(); Point p = square[kout[0]][kout[1]].getLocationOnScreen(); Dimension d = square[kout[0]][kout[1]].getSize(); r.mouseMove(p.x + (3 * d.width) / 4, p.y + (3 * d.height) / 4); }catch(AWTException e){ System.out.print(e.getMessage()); } } break; case KeyEvent.VK_DOWN: if((kart[0] + 1) < 9){ kout = Convert.kartesToKoutia(kart[0] + 1, kart[1]); try{ Robot r = new Robot(); Point p = square[kout[0]][kout[1]].getLocationOnScreen(); Dimension d = square[kout[0]][kout[1]].getSize(); r.mouseMove(p.x + (3 * d.width) / 4, p.y + (3 * d.height) / 4); }catch(AWTException e){ System.out.print(e.getMessage()); } } break; case KeyEvent.VK_LEFT: if((kart[1] - 1) >= 0){ kout = Convert.kartesToKoutia(kart[0], kart[1] - 1); try{ Robot r = new Robot(); Point p = square[kout[0]][kout[1]].getLocationOnScreen(); Dimension d = square[kout[0]][kout[1]].getSize(); r.mouseMove(p.x + (3 * d.width) / 4, p.y + (3 * d.height) / 4); }catch(AWTException e){ System.out.print(e.getMessage()); } } break; case KeyEvent.VK_RIGHT: if((kart[1] + 1) < 9){ kout = Convert.kartesToKoutia(kart[0], kart[1] + 1); try{ Robot r = new Robot(); Point p = square[kout[0]][kout[1]].getLocationOnScreen(); Dimension d = square[kout[0]][kout[1]].getSize(); r.mouseMove(p.x + (3 * d.width) / 4, p.y + (3 * d.height) / 4); }catch(AWTException e){ System.out.print(e.getMessage()); } } break; // For UNDO case KeyEvent.VK_Z: if(evt.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK) undo(); break; // For REDO case KeyEvent.VK_R: if(evt.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK) redo(); break; } } private void mouseClickedSquare(MouseEvent evt){ int k, l, state, index; MSquare ob = (MSquare) evt.getSource(); String name = ob.getName(); k = Integer.valueOf(String.valueOf(name.charAt(1))); l = Integer.valueOf(String.valueOf(name.charAt(2))); state = ob.getMarkState(); index = Convert.koutiaToIndex(k, l); if(evt.getButton() == MouseEvent.BUTTON1){ unmarkSquare(index); }else if(evt.getButton() == MouseEvent.BUTTON3){ state++; markSquare(index, state); } } /** * <code>mouseEnteredSquare</code> * <p>Starts the mouseOver effects for the squares</p> * @param evt */ private void mouseEnteredSquare(MouseEvent evt){ int[] kart = new int[2]; int k, l; MSquare ob = (MSquare) evt.getSource(); if(!showToolTip) ob.setToolTipText(null); refreshPossibles(); String name = ob.getName(); k = Integer.valueOf(String.valueOf(name.charAt(1))); l = Integer.valueOf(String.valueOf(name.charAt(2))); kart = Convert.koutiaToKartes(k, l); if(showTrace){ highlightLine(kart[0]); highlightColumn(kart[1]); highlightBox(k); } ob.grabFocus(); } /** * <code>mouseExitedSquare</code> * <p>Finishes the mouseOverEffects for the squares</p> * @param evt */ private void mouseExitedSquare(MouseEvent evt){ restoreBackColors(); } /** * <code>panelResized</code> * <p>Adjusts the size of the fonts when the game panel is resized</p> * @param evt */ public void panelResized(){ int pwidth = square[1][1].getWidth(); int pheight = square[1][1].getHeight(); int pav = (pwidth + pheight) / 2; for(int i = 0; i < 9; i++) for(int j = 0; j < 9; j++){ square[i][j].setFont(new Font("Arial", Font.BOLD, (pav / 15) * 10)); } } public void addToGame(int number, int index){ int[] kout = Convert.indexToKoutia(index); square[kout[0]][kout[1]].setText(String.valueOf(number)); square[kout[0]][kout[1]].animate(); square[kout[0]][kout[1]].setForeground(Color.BLACK); game.add(number, index); undoStack.add(new GameAction(GameAction.ADDITION, index, number)); if(game.checkFull()){ mStatus.stopTimer(); doParty(); }else setBackground(panelBackColor); } public void removeFromGame(int index, MSquare ob){ ob.setText(""); ob.setForeground(Color.BLACK); undoStack.add(new GameAction(GameAction.REMOVAL, index, game.get(index))); game.remove(index); if(!game.checkFull()) setBackground(panelBackColor); } public void addToGameNoUndo(int number, int index){ int[] kout = Convert.indexToKoutia(index); square[kout[0]][kout[1]].setText(String.valueOf(number)); square[kout[0]][kout[1]].animate(); square[kout[0]][kout[1]].setForeground(Color.BLACK); game.add(number, index); if(game.checkFull()){ mStatus.stopTimer(); doParty(); }else setBackground(panelBackColor); } public void removeFromGameNoUndo(int index){ int[] kout = Convert.indexToKoutia(index); MSquare ob = square[kout[0]][kout[1]]; ob.setText(""); ob.setForeground(Color.BLACK); game.remove(index); if(!game.checkFull()) setBackground(panelBackColor); } public void undo(){ GameAction ga = null; if(!undoStack.isEmpty()){ ga = undoStack.pop(); redoStack.push(ga); switch(ga.getAction()){ case GameAction.ADDITION: removeFromGameNoUndo(ga.getIndex()); break; case GameAction.REMOVAL: addToGameNoUndo(ga.getNumber(), ga.getIndex()); break; } } } public void redo(){ GameAction ga = null; if(!redoStack.isEmpty()){ ga = redoStack.pop(); undoStack.push(ga); switch(ga.getAction()){ case GameAction.ADDITION: addToGameNoUndo(ga.getNumber(), ga.getIndex()); break; case GameAction.REMOVAL: removeFromGameNoUndo(ga.getIndex()); break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -