0

所以我有一个摆动应用程序,其中一个按钮打开一个窗口。这很简单,打开它我使用:

private static logPicker logWindow;
static boolean logViewerOpen = false;

if (!logViewerOpen) {
    logWindow = new logPicker();
    logWindow.frmOpenLog.setVisible(true);
    logViewerOpen = true;
}
else {
    logWindow.frmOpenLog.requestFocus();
}

我还有一个窗口侦听器可以知道查看器何时关闭:

frmOpenLog.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent arg0) {
        indexPage.logViewerOpen = false;
        frmOpenLog.dispose();
    }
});

我这样做是因为我想跟踪窗口是否已经打开,因为如果是,那么我必须更新信息。我打开的窗口有一个日志列表,用户可以双击该列表来查看有关该日志的信息。现在的问题是,当用户双击列表时,无论我打开和关闭该窗口多少次都会调用它。示例:我打开日志选择器窗口,然后将其关闭。我再次打开它并双击我要查看的日志,它将打开其中的 2 个。.doClick()我在“打开日志”按钮上双击简单地做一个。奇怪的是,当我使用按钮打开日志时,它并没有这样做。它只会打开一次日志。这是双击事件和打开日志按钮的代码。

@Override
public void mouseClicked(MouseEvent arg0) {
    if (arg0.getClickCount() == 2) {
        btnOpenLog.doClick();
    }
}

btnOpenLog.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
        logViewer window = new logViewer(log.getSelectedValue());
        window.frmLogViewer.setVisible(true);
    }
});
4

1 回答 1

2

@LiverpoolFTW:请提供证明问题的SSCCE。如果没有足够的代码,我推测您每次打开窗口时都会(重新)添加 MouseListener/MouseAdapter。以下示例按原样工作,每次按下按钮或双击标签时,clickCount 都会增加一次。但是如果您取消注释指示的部分,您会看到在双击标签时执行了两次 doClick()。例如,如果您有某个组件,每次打开窗口时都向其添加侦听器,则每个侦听器都将被执行。

package example.stackoverflow;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class ClickCheck extends JFrame
{
    private static final long serialVersionUID = -6446528001976145548L;
    private static final JButton btnOpenLog = new JButton("Open Log");
    public ClickCheck()
    {
        JLabel label = new JLabel("Double-Click Me");
        label.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                if (arg0.getClickCount() == 2) {
                    btnOpenLog.doClick();
                }
            }
        });

        // Uncomment to demonstrate the effect of multiple listeners
//        label.addMouseListener(new MouseAdapter()
//        {
//            @Override
//            public void mouseClicked(MouseEvent arg0) {
//                if (arg0.getClickCount() == 2) {
//                    btnOpenLog.doClick();
//                }
//            }
//        });

        btnOpenLog.addActionListener(new ActionListener() {
            private int clickCount = 0;
            public void actionPerformed(ActionEvent e) {
                    System.out.println(++clickCount + ": Button clicked");
                }
            });


        setSize(200, 200);
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        add(btnOpenLog);
        add(label);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                ClickCheck c = new ClickCheck();
                c.setVisible(true);
            }
        });
    }
}
于 2013-08-05T20:22:21.607 回答