在互联网上找到了此代码,它是在多年前发布的,因此,我决定在这里询问一些我不太了解的行的说明。
在该mousePressed
方法中,他的意思是: chessPiece = null
他是说如果JLabel chessPiece
图像中有图像,则应将其更改为null
?
是chessBoard.findComponentAt(e.getX(), e.getY())
返回JPanel
平方?
最后,当Component c
获得其父母时,谁是父母?
整个代码如下:
public class ChessGameDemo extends JFrame implements MouseListener, MouseMotionListener {
JLayeredPane layeredPane;
JPanel chessBoard;
JLabel chessPiece;
int xAdjustment;
int yAdjustment;
private static final String imageFolderPath = "src/resources/images/";
public ChessGameDemo() {
Dimension boardSize = new Dimension(600, 600);
// Use a Layered Pane for this this application
layeredPane = new JLayeredPane();
getContentPane().add(layeredPane);
layeredPane.setPreferredSize(boardSize);
layeredPane.addMouseListener(this);
layeredPane.addMouseMotionListener(this);
//Add a chess board to the Layered Pane
chessBoard = new JPanel();
layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
chessBoard.setLayout(new GridLayout(8, 8));
chessBoard.setPreferredSize(boardSize);
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
for (int i = 0; i < 64; i++) {
JPanel square = new JPanel(new BorderLayout());
chessBoard.add(square);
int row = (i / 8) % 2;
if (row == 0) {
square.setBackground(i % 2 == 0 ? Color.blue : Color.white);
} else {
square.setBackground(i % 2 == 0 ? Color.white : Color.blue);
}
}
//Add a few pieces to the board
JLabel piece = new JLabel(new ImageIcon(imageFolderPath + "/pieces/bdg.png"));
JPanel panel = (JPanel) chessBoard.getComponent(0);
panel.add(piece);
piece = new JLabel(new ImageIcon(imageFolderPath + "/pieces/belder.png"));
panel = (JPanel) chessBoard.getComponent(15);
panel.add(piece);
piece = new JLabel(new ImageIcon(imageFolderPath + "/pieces/bhero.png"));
panel = (JPanel) chessBoard.getComponent(16);
panel.add(piece);
piece = new JLabel(new ImageIcon(imageFolderPath + "/pieces/borb.png"));
panel = (JPanel) chessBoard.getComponent(20);
panel.add(piece);
}
public void mousePressed(MouseEvent e) {
chessPiece = null;
Component c = chessBoard.findComponentAt(e.getX(), e.getY());
if (c instanceof JPanel) {
return;
}
Point parentLocation = c.getParent().getLocation();
xAdjustment = parentLocation.x - e.getX();
yAdjustment = parentLocation.y - e.getY();
chessPiece = (JLabel) c;
chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);
chessPiece.setSize(chessPiece.getWidth(), chessPiece.getHeight());
layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
}
//Move the chess piece around
public void mouseDragged(MouseEvent me) {
if (chessPiece == null) {
return;
}
chessPiece.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment);
}
//Drop the chess piece back onto the chess board
public void mouseReleased(MouseEvent e) {
if (chessPiece == null) {
return;
}
chessPiece.setVisible(false);
Component c = chessBoard.findComponentAt(e.getX(), e.getY());
if (c instanceof JLabel) {
Container parent = c.getParent();
parent.remove(0);
parent.add(chessPiece);
} else {
Container parent = (Container) c;
parent.add(chessPiece);
}
....
}
在该
mousePiece
方法中,他的意思是:chessPiece = null
他是说如果JLabel chessPiece
图像中有图像,则应将其更改为null
?
我想你是故意的mousePressed
。通过使用chessPiece = null
,作者取消引用变量,因此分配给它的内容不再可通过is变量访问。
是
chessBoard.findComponentAt(e.getX(), e.getY())
返回JPanel
平方?
这取决于。
findComponentAt
可以搜索当前容器及其任何子容器,直到在指定位置找到组件为止。技术上,作者忽略了触发事件的组件(应为layeredPane
),chessBoard
而是忽略了该组件。我怀疑他们正在这样做,因为如果使用layeredPane
它,它将返回chessBoard
。
该方法可以返回JPanel
,JLabel
甚至可以返回,null
但是考虑到组件布局的方式,这种方法的可能性较低。
最后,当组件c获得其父项时,谁是父项?
这取决于。根据我对代码的理解,我会说它返回了一块JPanel
底层代码JLabel
。
不得不说,虽然有更简单的方法可以达到相同的结果…
现在,编辑器在使用注释方法的地方显示警告。然后显示使用的建议。当我接受它的更改时,它会将代码转换为此,警告消失。 使用有意义吗? 实现是 所以如果为空,我的代码仍然会崩溃。 我们应该对此进行空检查。 我认为比好,你说呢?如果是,则编辑器不应建议在此处使用。 因为在具有状态(如)的字段中使用要求NonNull是不安全的。我是否错过了的一些好处?
问题内容: 我对关于volatile关键字在Java中的应用的了解感到非常困惑。 以下陈述正确吗?“对易失性字段的写操作在每次随后读取相同字段之前发生” 理想情况下,何时应使用volatile关键字? 之间有什么区别? 和 问题答案: volatile 是 字段修饰符 ,而 sync则 修饰 代码块 和 方法 。因此,我们可以使用这两个关键字来指定简单访问器的三种变体: 访问当前存储在当前线程中的
问题内容: 我从未使用过支付网关做任何事情,有人可以给我建议吗? 问题答案: 支付网关因国家/地区而异,它们是可以在您的应用程序中启用付款处理的代理机构。 例如。在英国,BT拥有付款网关。他们称其为BTBuynet。在印度,ICICI是主要的支付网关提供商之一。您也可以签出paypal。 他们每个人都有自己的实现方式。通常每个付款网关都有2种付款处理方式。 付款页面 :这是最常用的 页面 之一。网
我对c中的属性格式说明符感到困惑。我在编译一些代码时遇到了一个警告。以下是警告: 警告:格式的参数太多 [-W 格式-额外参数] 下面是一个示例代码: 输出如下: 只要满足以下条件(基于实验),就会发出警告: < li >要检查的格式为空。 < li >在属性格式说明符的第三个参数中传递了一个零 < li >格式不是函数中的最后一个参数。 以下代码似乎工作正常,这让我相信NULL是一个有效的字符串
问题内容: 当我编译上面的代码时,我得到一个真值。 但是那怎么可能呢,因为参数的第二部分(因为b已经是真的)基本上转化为 应该返回。那么该语句将是。 我想念什么? 问题答案: Java行为正确:) 那就是 后缀 增量。 它生成结果,然后再增加该值。 将使用之前的,然后使用它。 当您使用++时,就像 Postfix Increment Operator ++上的语言规范 将值1加到变量的值上,然后将
我们有申报单 其中backlog被标识为传入连接的最大队列长度。如果连接指示在队列已满时到达,则会拒绝连接。 假设积压设置为10。 这是否意味着服务器套接字将接受不超过10个客户端? 然后: 只有当时,积压数才会下降。这是正确的吗? 有没有办法知道一个套接字当前正在处理多少个打开的连接(换句话说,它离放弃并开始拒绝新连接有多近)