Java 使用getHeight()和getWidth()时,矩形未使用包含正确边界
我一直在兜圈子,试图弄明白为什么这不起作用。我有一个矩形,它位于0,0。高度和宽度分别为getHeight的1/3和getWidth()的1/3。我有一个鼠标事件“捕获”x和y坐标。当我使用“矩形”时。包含(鼠标的x和y) *编辑:当我检查鼠标单击的位置时,它总是返回为0,0* 以下是我的一些代码:Java 使用getHeight()和getWidth()时,矩形未使用包含正确边界,java,height,width,jpanel,Java,Height,Width,Jpanel,我一直在兜圈子,试图弄明白为什么这不起作用。我有一个矩形,它位于0,0。高度和宽度分别为getHeight的1/3和getWidth()的1/3。我有一个鼠标事件“捕获”x和y坐标。当我使用“矩形”时。包含(鼠标的x和y) *编辑:当我检查鼠标单击的位置时,它总是返回为0,0* 以下是我的一些代码: package com.blackattack.tictactoe; import java.awt.Color; import java.awt.Graphics; import java.aw
package com.blackattack.tictactoe;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
public class TicTacToePanel extends JPanel implements MouseListener {
Graphics2D g2d;
Rectangle[] bounds = new Rectangle[9];
TicTacToeLogic board = new TicTacToeLogic();
int STATE = 0;
final int PLAYING = 0;
final int LOSS = 1;
final int WIN = 2;
Win w = new Win(false, "e");
public TicTacToePanel() {
super();
addMouseListener(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
bounds[0] = new Rectangle(0, 0, getWidth()/3, getHeight()/3);
bounds[1] = new Rectangle(getWidth()/3, 0, getWidth()/3, getHeight()/3);
bounds[2] = new Rectangle((getWidth()/3)*2, 0, getWidth()/3, getHeight()/3);
bounds[3] = new Rectangle(0, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[4] = new Rectangle(getWidth()/3, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[5] = new Rectangle((getWidth()/3)*2, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[6] = new Rectangle(0, getHeight()/3, (getWidth()/3)*2, getHeight()/3);
bounds[7] = new Rectangle(getWidth()/3, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
bounds[8] = new Rectangle((getWidth()/3)*2, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
if(w.didWin && w.who.equals("x")){
STATE = WIN;
}
if(w.didWin && w.who.equals("o")){
STATE = LOSS;
}
g2d = (Graphics2D) g;
if(STATE == PLAYING) {
g2d.setColor(Color.black);
g2d.drawLine(getWidth() / 3, 0, getWidth() / 3, getHeight());
g2d.drawLine((getWidth() / 3) * 2, 0, (getWidth() / 3) * 2, getHeight());
g2d.drawLine(0, getHeight() / 3, getWidth(), getHeight() / 3);
g2d.drawLine(0, (getHeight() / 3) * 2, getWidth(),
(getHeight() / 3) * 2);
g2d.setColor(Color.blue);
if(board.board[0].equals("x")) {
g2d.drawLine(0, 0, getWidth()/3, getHeight()/3);
g2d.drawLine(getWidth()/3, 0, 0, getHeight()/3);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
int x = getX();
int y = getY();
// check which "bounds" contains the mouse click?
for (int i = 0; i < bounds.length; i++) {
if (bounds[i].contains(e.getPoint())) {
System.out.println("Point " + x + " " + y + " contains mouse");
}
}
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
}
package com.blackattack.tictactoe;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JPanel;
公共类TictoePanel扩展JPanel实现MouseListener{
图形2d-g2d;
矩形[]边界=新矩形[9];
TicTacToeLogic板=新的TicTacToeLogic();
int STATE=0;
最终整型播放=0;
最终积分损失=1;
最终int WIN=2;
Win w=新的Win(假,“e”);
公共事务委员会{
超级();
addMouseListener(这个);
}
公共组件(图形g){
超级组件(g);
边界[0]=新矩形(0,0,getWidth()/3,getHeight()/3);
边界[1]=新矩形(getWidth()/3,0,getWidth()/3,getHeight()/3);
边界[2]=新矩形((getWidth()/3)*2,0,getWidth()/3,getHeight()/3);
边界[3]=新矩形(0,getHeight()/3,getWidth()/3,getHeight()/3);
边界[4]=新矩形(getWidth()/3,getHeight()/3,getWidth()/3,getHeight()/3);
边界[5]=新矩形((getWidth()/3)*2,getHeight()/3,getWidth()/3,getHeight()/3);
边界[6]=新矩形(0,getHeight()/3,(getWidth()/3)*2,getHeight()/3);
边界[7]=新矩形(getWidth()/3,(getHeight()/3)*2,getWidth()/3,getHeight()/3);
边界[8]=新矩形((getWidth()/3)*2,(getHeight()/3)*2,getWidth()/3,getHeight()/3);
如果(w.didWin&&w.who.equals(“x”)){
国家=胜利;
}
如果(w.didWin&w.who.equals(“o”)){
状态=损失;
}
g2d=(图2d)g;
如果(状态==正在播放){
g2d.setColor(Color.black);
g2d.drawine(getWidth()/3,0,getWidth()/3,getHeight());
g2d.绘图线((getWidth()/3)*2,0,(getWidth()/3)*2,getHeight());
g2d.绘图线(0,getHeight()/3,getWidth(),getHeight()/3);
g2d.绘图线(0,(getHeight()/3)*2,getWidth(),
(getHeight()/3)*2);
g2d.setColor(Color.blue);
if(board.board[0]。等于(“x”)){
g2d.绘图线(0,0,getWidth()/3,getHeight()/3);
g2d.绘图线(getWidth()/3,0,0,getHeight()/3);
}
}
}
@凌驾
公共无效mouseClicked(MouseEvent e){
intx=getX();
int y=getY();
//检查哪些“边界”包含鼠标点击?
for(int i=0;i
我的一些理论是:
- 在paintComponent期间调用getHeight/Width不起作用,但当我画线时,它可以完美地工作
- 在创建矩形时,我将值放在了错误的位置,但我检查了两次
- 我尝试过使用代码,但没有成功
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类mainGUI扩展JFrame{
TicTacToePanel tic=新的TicTacToePanel();
公共mainGUI(){
超级(“Tic Tac Toe”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置大小(900700);
可设置大小(假);
添加(tic);
setVisible(真);
}
公共类TictoePanel扩展JPanel实现MouseListener{
图形2d-g2d;
矩形[]边界=新矩形[9];
TicTacToeLogic板=新的TicTacToeLogic();
int STATE=0;
最终整型播放=0;
最终积分损失=1;
最终int WIN=2;
Win w=新的Win(假,“e”);
公共事务委员会{
超级();
addMouseListener(这个);
}
公共组件(图形g){
超级组件(g);
边界[0]=新矩形(0,0,getWidth()/3,getHeight()/3);
边界[1]=新矩形(getWidth()/3,0,getWidth()/3,getHeight()/3);
边界[2]=新矩形((getWidth()/3)*2,0,getWidth()/3,getHeight()/3);
边界[3]=新矩形(0,getHeight()/3,getWidth()/3,getHeight()/3);
边界[4]=新矩形(getWidth()/3,getHeight()/3,getWidth()/3,getHeight()/3);
边界[5]=新矩形((getWidth()/3)*2,getHeight()/3,getWidth()/3,getHeight()/3);
边界[6]=新矩形(0,getHeight()/3,(getWidth()/3)*2,getHeight()/3);
边界[7]=新矩形(getWidth()/3,(getHeight()/3)*2,getWidth()/3,getHeight()/3);
边界[8]=新矩形((getWidth()/3)*2,(getHeight()/3)*2,getWidth()/3,getHeight()/3);
如果(w.didWin&&w.who.equals(“x”)){
国家=胜利;
}
如果(w.didWin&w.who.equals(“o”)){
装货单
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class mainGUI extends JFrame {
TicTacToePanel tic = new TicTacToePanel();
public mainGUI() {
super("Tic Tac Toe");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(900, 700);
setResizable(false);
add(tic);
setVisible(true);
}
public class TicTacToePanel extends JPanel implements MouseListener {
Graphics2D g2d;
Rectangle[] bounds = new Rectangle[9];
TicTacToeLogic board = new TicTacToeLogic();
int STATE = 0;
final int PLAYING = 0;
final int LOSS = 1;
final int WIN = 2;
Win w = new Win(false, "e");
public TicTacToePanel() {
super();
addMouseListener(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
bounds[0] = new Rectangle(0, 0, getWidth()/3, getHeight()/3);
bounds[1] = new Rectangle(getWidth()/3, 0, getWidth()/3, getHeight()/3);
bounds[2] = new Rectangle((getWidth()/3)*2, 0, getWidth()/3, getHeight()/3);
bounds[3] = new Rectangle(0, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[4] = new Rectangle(getWidth()/3, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[5] = new Rectangle((getWidth()/3)*2, getHeight()/3, getWidth()/3, getHeight()/3);
bounds[6] = new Rectangle(0, getHeight()/3, (getWidth()/3)*2, getHeight()/3);
bounds[7] = new Rectangle(getWidth()/3, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
bounds[8] = new Rectangle((getWidth()/3)*2, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
if(w.didWin && w.who.equals("x")){
STATE = WIN;
}
if(w.didWin && w.who.equals("o")){
STATE = LOSS;
}
g2d = (Graphics2D) g;
if(STATE == PLAYING) {
g2d.setColor(Color.black);
g2d.drawLine(getWidth() / 3, 0, getWidth() / 3, getHeight());
g2d.drawLine((getWidth() / 3) * 2, 0, (getWidth() / 3) * 2, getHeight());
g2d.drawLine(0, getHeight() / 3, getWidth(), getHeight() / 3);
g2d.drawLine(0, (getHeight() / 3) * 2, getWidth(),
(getHeight() / 3) * 2);
g2d.setColor(Color.blue);
if(board.board[0].equals("x")) {
g2d.drawLine(0, 0, getWidth()/3, getHeight()/3);
g2d.drawLine(getWidth()/3, 0, 0, getHeight()/3);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
int x = getX();
int y = getY();
// check which "bounds" contains the mouse click?
for (int i = 0; i < bounds.length; i++) {
if (bounds[i].contains(e.getPoint())) {
board.changeState(i, "x");
System.out.println("Point " + x + " " + y + " contains mouse");
}
}
repaint();
}
@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 class TicTacToeLogic {
String[] board = { "e", "e", "e", "e", "e", "e", "e", "e", "e" };
public TicTacToeLogic() {
}
public void changeState(int pos, String val) {
board[pos] = val;
}
public void aiPlayerChoose() {
boolean ready = true;
if(isWin().who.equals("x") && isWin().didWin){
ready=false;
}
while (ready) {
Random r = new Random(System.currentTimeMillis());
int which = r.nextInt(8);
if (board[which].equals("e")) {
board[which] = "o";
ready = false;
}
}
}
public Win isWin() {
// o
if (board[0].equals("x") && board[1].equals("x")
&& board[2].equals("x")) {
return new Win(true, "x");
}
if (board[3].equals("x") && board[4].equals("x")
&& board[5].equals("x")) {
return new Win(true, "x");
}
if (board[6].equals("x") && board[7].equals("x")
&& board[8].equals("x")) {
return new Win(true, "x");
}
// o
if (board[0].equals("o") && board[1].equals("o")
&& board[2].equals("o")) {
return new Win(true, "o");
}
if (board[3].equals("o") && board[4].equals("o")
&& board[5].equals("o")) {
return new Win(true, "o");
}
if (board[6].equals("o") && board[7].equals("o")
&& board[8].equals("o")) {
return new Win(true, "o");
}
// x
if (board[0].equals("x") && board[4].equals("x")
&& board[8].equals("x")) {
return new Win(true, "x");
}
if (board[2].equals("x") && board[4].equals("x")
&& board[6].equals("x")) {
return new Win(true, "x");
}
// o
if (board[0].equals("o") && board[4].equals("o")
&& board[8].equals("o")) {
return new Win(true, "o");
}
if (board[2].equals("o") && board[4].equals("o")
&& board[6].equals("o")) {
return new Win(true, "o");
}
// x
if (board[0].equals("x") && board[3].equals("x")
&& board[6].equals("x")) {
return new Win(true, "x");
}
if (board[1].equals("x") && board[4].equals("x")
&& board[7].equals("x")) {
return new Win(true, "x");
}
if (board[2].equals("x") && board[5].equals("x")
&& board[8].equals("x")) {
return new Win(true, "x");
}
// x
if (board[0].equals("o") && board[3].equals("o")
&& board[6].equals("o")) {
return new Win(true, "o");
}
if (board[1].equals("o") && board[4].equals("o")
&& board[7].equals("o")) {
return new Win(true, "o");
}
if (board[2].equals("o") && board[5].equals("o")
&& board[8].equals("o")) {
return new Win(true, "o");
}
return new Win(false, "e");
}
}
public class Win {
boolean didWin = false;
String who = "";
public Win(boolean i, String s) {
didWin = i;
who = s;
}
}
public static void main(String[] args) {
mainGUI app = new mainGUI();
}
}
@Override
public void mouseClicked(MouseEvent e) {
int x = getX();
int y = getY();
// check which "bounds" contains the mouse click?
for (int i = 0; i < bounds.length; i++) {
if (bounds[i].contains(e.getPoint())) {
System.out.println("Point " + i + " contains mouse");
}
}