componentListener getting disabled



我有一个不寻常的问题,其中每当Mouselistener/适配器检测到事件时,componentListener/适配器将被禁用。在下面的代码中,componentMoved()方法覆盖完美工作,直到mouseClicked()方法覆盖在MouseAdapter()中。有什么想法如何解决?

public AlertScroller(String msg,Color col) {
    addComponentListener(new ComponentAdapter() {
        @Override
        public void componentMoved(ComponentEvent e) {
            setShape(new Rectangle2D.Double(0, 0, getWidth(), newHeight));
            if(!isVisible())
                setVisible(true);
        }
    });
    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent click) {
            if(SwingUtilities.isLeftMouseButton(click)) {
                autoClear = false;
                scrollOff();
            }
        }
    });
    setAlwaysOnTop(true);
    JPanel panel = new JPanel();
        panel.setBorder(compound);
        panel.setBackground(col);
    JLabel imgLbl = new JLabel(msg);
        imgLbl.setFont(new Font("Arial",Font.BOLD,30));
    panel.add(imgLbl);
    setContentPane(panel);
    pack();
}

此方法在扩展JWindow中的类。

编辑:添加了scrollOff()方法的代码。

public void scrollOff() {
    Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
    int taskBar = scnMax.bottom;
    int x = screenSize.width - getWidth();
    int yEnd = screenSize.height - taskBar;
    int yStart = this.getBounds().y;
    setLocation(x,yStart);
    int current = yStart;
    newHeight = this.getBounds().height;
    while(current < yEnd) {
        current+=2;
        newHeight = yEnd - current;
        setLocation(x,current);
        try {
            Thread.sleep(30);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    dispose();
    Main.alertControl.setAlertActive(false);
}

这基本上是Scrollon()方法的确切反向,并且只要通过Listener以外的任何方式触发。

编辑2:在下面固定的代码,多亏了MadProgrammer的建议

public void scrollOff() {
    x = screenSize.width - getWidth();
    yEnd = screenSize.height - taskBar;
    yStart = this.getBounds().y;
    setLocation(x,yStart);
    current = yStart;
    newHeight = this.getBounds().height;
    ActionListener action = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            if(current < yEnd) {
                current+=2;
                newHeight = yEnd - current;
                setLocation(x,current);
            } else {
                timer.stop();
            }
        }
    };
    timer = new Timer(30, action);
    timer.setInitialDelay(0);
    timer.start();
    Main.alertControl.setAlertActive(false);
}

我还使用else if更新了AlertScroller()构造方法,以正确隐藏窗口:

    addComponentListener(new ComponentAdapter() {
        @Override
        public void componentMoved(ComponentEvent e) {
            setShape(new Rectangle2D.Double(0, 0, getWidth(), newHeight));
            if(!isVisible())
                setVisible(true);
            else if(getBounds().y == screenSize.height - taskBar)
                setVisible(false);
        }
    });

setVisible(false)放置在其他任何地方都导致窗口再次变得可见。

while loop很危险,Thread.sleep是危险的,并且处置只是简单的可怕...

您违反了摇摆的单线规则,并阻止事件派遣线程。

有关更多详细信息,请参见Swing中的并发

dispose可能正在处理与窗口关联的本机对等,这不会导致问题的终结...

有关更多详细信息,请参见JWindow#dispose

假设您正在尝试滑动窗口打开/关闭屏幕,则应使用摇摆Timer,当触发时,它将更新窗口的位置,直到达到目标点,并且您只需更改哪个时间窗户可见性。假设您要重复使用窗口的实例。

有关更多详细信息,请参见如何使用摆动计时器。

相关内容

  • 没有找到相关文章

最新更新