gpt4 book ai didi

Java Swing 第二个窗口在被释放后调用事件监听器两次

转载 作者:行者123 更新时间:2023-12-02 06:50:42 26 4
gpt4 key购买 nike

所以我有一个 swing 应用程序,其中一个按钮可打开一个窗口。这非常简单,打开它我使用:

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);
}
});

最佳答案

@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);
}
});
}
}

关于Java Swing 第二个窗口在被释放后调用事件监听器两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com