当前位置: 首页 > 知识库问答 >
问题:

如何在JPanel中的mouselistener类中注册两点?

奚高扬
2023-03-14
public class Tiles extends JPanel implements MouseListener {

Color c2, cc, tmp;
boolean isWhite, hasChecker, isHighlighted;
int i, j;
ArrayList<Point> al = new ArrayList<Point>();
ArrayList<Point> TempArray = new ArrayList<Point>();
Point start;
Point temp;

public Tiles(Color c, Point s){

     this.setSize(75, 75);
     this.setLayout(null);
     this.addMouseListener(this);
     this.c2 = c;
     tmp = c2;
     this.start = s;

  }

public void setWhite(boolean isWhite){
    this.isWhite = isWhite;
}

public void hasChecker(boolean hasChecker){
    this.hasChecker = hasChecker;
}

public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D)g;
    super.paintComponent(g2);
    //if(isClicked == true)
    //  highlightPossibleMoves(start);
    drawTile(g2);
    if(hasChecker == true)
        addCheckers(g2);



}

public void drawTile(Graphics2D g2){

    g2.setColor(c2);

    g2.fillRect(3, 3, 75, 75);

}

public void addCheckers(Graphics2D g2){
    if(isWhite == true){
        g2.setColor(Color.white);
    }
    else{
        g2.setColor(Color.black);
    }
    Ellipse2D.Double circle = new Ellipse2D.Double(13, 11, 50, 50);
    g2.fill(circle);
}

public boolean highlightPossibleMoves(Point start){
    al = LOA.b.getPossibleMoves(start);
    if(!al.isEmpty()){
        for(int i = 0; i<al.size(); i++){
            LOA.Jboard[al.get(i).getY()][al.get(i).getX()].c2 = Color.green;
            LOA.Jboard[al.get(i).getY()][al.get(i).getX()].repaint();
        }
        return true;
    }
    return false;
}

public Point getThisPoint(){
    return this.start;
}

public boolean isPossible(Point p){
    if (TempArray.contains(p)){
        System.out.println("contains");
        return true;
    }
    return false;
}

    @Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent arg0) {

}

@Override
public void mouseExited(MouseEvent arg0) {

}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {
        if(isHighlighted = true){
            LOA.initBoard();
        }
        if(highlightPossibleMoves(getThisPoint()) == true){
            this.isHighlighted = true;
        }           
        if(isPossible(getThisPoint()))
            LOA.move(this.temp, getThisPoint());
        else{
            System.out.println("x =" + this.start.getX() + "y =" + this.start.getY());
            this.temp = new Point(getThisPoint().getX(), getThisPoint().getY());
        }
        this.repaint();
        this.validate();                        
}
}

共有1个答案

蒙勇
2023-03-14

我可以给出相同的业务逻辑

  • 创建带有网格布局的板
  • 而不是JPanels,我认为是JButtons(根据它们的位置设置JButtons的名称a1、a2、a3..)
  • 一旦用户单击按钮,将所选按钮的颜色更改为绿色(您可以轻松地存储所选按钮的名称,并知道选择了什么按钮。您还可以将计数数更新为1,以便跟踪该部分尚未移动)
  • 此后,当用户单击另一个按钮时,即用户选择另一个有效的网格…您可以在黑板上移动

这样,您不必担心保存一个点,而是保存一个选定的组件

 类似资料:
  • 在我的应用程序中,我有以下代码可注册到GCM服务: 当我运行这段代码时,我在服务器中看到我的设备用2个不同的注册了两次,当服务器发送推送时,设备收到2条消息。 这是正常的事情吗?有没有办法确保只有一个?

  • 问题内容: 如何在Swift中使用(以前)? 这是我尝试复制的一个Objective-C示例: 但是,Swift似乎没有,这(似乎)意味着我无法在未实现的方法上调用方法。 我已经在Swift中尝试了基于对象的版本,但似乎使Playground崩溃了: 但是它似乎崩溃了,即使我的对象接受了一个类型的参数 在Swift中执行此操作的最佳方法是什么?有没有一种方法可以避免通过基于对象的注册发送不必要的对

  • 我想设置一个由多个步骤组成的用户注册。每个步骤将以条的形式突出显示。深灰色条将是完成的步骤,浅灰色条将是需要完成的步骤。似乎想不出这样做的方法。请建议。 我们可以在myfitnesspal注册中看到这一点。我在下图的红色框中突出显示了这一点。

  • 具有方法: 但是,它在属性提供的facade中不可用/公开 下面是有关RuntimeConfiguration的更多信息: 在创建自己的SparkSession时,有一个明确的解决方法:我们可以调用提供给 然后是一个不太清楚的... 但在运行Spark shell时,已经创建了sparkSession(sparkContext)。那么,如何使非运行时设置生效呢? 这里特别需要: 当尝试在可用于sp

  • 然后在'main'类中,我将'panel'添加到JFrame中。 我的问题是,我正在尝试实现一个actionListener到一个添加在'Panel'类内部的按钮。actionListener函数将添加更多按钮并使用G.DrawString的按钮。现在,我要将ActionListener放置在哪里,以便这样做呢?如何将g.drawString用于特定的面板,而g.drawString行位于另一个类

  • 问题内容: 因此,这可能是一个愚蠢的问题,但是何时使用以下方法注册课程: 当前,我正在类似接口的类的构造函数中执行此操作,该类在其他类中用于简化数据存储对我的应用程序的使用。但是,我收到此错误: 尝试两次注册种类“用户” 所以,我想我的问题是,您多久在一次Objective中注册类? 谢谢! PS这是我的整个课程: 问题答案: 更新资料 这是最佳实践解决方案: 使用您自己的服务,这可以确保在使用O