当前位置: 首页 > 面试题库 >

在Java中要求有关jlabel和parent的一些澄清

阳兴朝
2023-03-14
问题内容

在互联网上找到了此代码,它是在多年前发布的,因此,我决定在这里询问一些我不太了解的行的说明。

在该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

该方法可以返回JPanelJLabel甚至可以返回,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个客户端? 然后: 只有当时,积压数才会下降。这是正确的吗? 有没有办法知道一个套接字当前正在处理多少个打开的连接(换句话说,它离放弃并开始拒绝新连接有多近)