我无法选择何时使用 MouseListener object

I'm having trouble choosing when to use a MouseListener object

抱歉标题不好,我想不出更好的措辞方式。

无论如何,当同一容器中有超过 2 个 objects 时,我需要我的 JLabel 具有不同的 MouseListener。我正在尝试制作一个日历程序,以便将这些标签添加到 42 个面板中。当标签太多时,我希望最后一个能够打开一个 window 来显示其余部分。

现在,当有超过 2 个标签时,最后一个标签同时具有来自 if (number_of_labels[index-7]) 语句和 if (mouseListenerActive) 语句的 mouseListener。

这个方法在别处循环调用。如果您需要查看其他任何内容,我会添加它。

public static void insertLabel(String text, final int index, Color colour) {
    final JLabel label = new JLabel();

    label.setText(text);
    label.setOpaque(true);
    label.setBackground(colour);

    mouseListenerActive = true;

    if (number_of_labels[index-7] == 2) {
        label.setBackground(Color.RED);
        JLabel last_label = (JLabel) calendar_boxes[index].getComponent(2);
        last_label.setText("     ▼");
        last_label.setForeground(Color.WHITE);
        last_label.setBackground(Color.BLACK);

        mouseListenerActive = false;
        last_label.addMouseListener(new MouseListener() {
            @Override public void mouseExited(MouseEvent e) {}
            @Override public void mouseEntered(MouseEvent e) {}
            @Override public void mouseReleased(MouseEvent e) {}
            @Override public void mousePressed(MouseEvent e) {}

            @Override
            public void mouseClicked(MouseEvent e) {
                //int day = index - (position of last day - number of days in current month)
                int day = index - (Integer.parseInt(monthDataNode.getChildNodes().item(Main.year-1900).getChildNodes().item(Main.month_index-1).getTextContent()) - Constants.month_lengths[Main.month_index-1]);
                calendarList.open(day, Main.month_index-1, Main.year);
            }
        });
    } else if (number_of_labels[index-7] > 2) {
        return;
    }

    if (mouseListenerActive) {
        label.addMouseListener(new MouseListener() {
            @Override public void mouseExited(MouseEvent e) {}
            @Override public void mouseEntered(MouseEvent e) {}
            @Override public void mouseReleased(MouseEvent e) {}
            @Override public void mousePressed(MouseEvent e) {}

            @Override
            public void mouseClicked(MouseEvent e) {
                //int day = index - (position of last day - number of days in current month)
                int day = index - (Integer.parseInt(monthDataNode.getChildNodes().item(Main.year-1900).getChildNodes().item(Main.month_index-1).getTextContent()) - Constants.month_lengths[Main.month_index-1]);
                calendarEdit.open(day, Main.month_index-1, Main.year, label.getText());
            }
        });
    }

    calendar_boxes[index].add(label, new AbsoluteConstraints(19, 6+(15*number_of_labels[index-7]), 40, 12));
    number_of_labels[index-7]++;
}

在您的代码中,在添加第二个 MouseListener 之前,删除第一个。由于您使用的是匿名 类 并且没有对原始 MouseListener 的引用,因此请使用以下内容:

MouseListener existingListener = last_label.getMouseListeners()[0];
last_label.removeMouseListener(existingListener);