JList 元素上的双击事件

Double click event on JList element

我有一个问题,我自己找不到答案。 我正在 java 中进行简单的聊天,并用名称填充了 JList。双击名称时,需要将该名称作为参数传递给另一个框架(作为收件人名称)。但是,双击不起作用

我有一个主要的 class InstantMessageFrame,其中初始化了一个名为 friends 的 JList 并填充了一个字符串数组。

private JList<String> friends;
String names[] = { "Ana", "Banana", "Cikla", "Doris", "Ema", "Mirna","Matea","Veronika","Vera","Marta","Mirta","Davor","Marko","Matko","Kloki" };
JList<String> friends = new JList<String>(names);

此外,我向我的 JList 添加了一个侦听器

DisplayMessageDialog dmd = new DisplayMessageDialog();
friends.addMouseListener(dmd);

这是我的 DisplayMessageDialog class,它检查是否有双击。如果双击,就会出现一个新的框架。第一个 "if" 语句中的 None 行执行(一个带有 e.getClickCount())

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class DisplayMessageDialog extends MouseAdapter
{
    public void mouseClicked(MouseEvent e)
    {
        JList theList = (JList) e.getSource();
        if (e.getClickCount() == 2) 
        {
            int index = theList.locationToIndex(e.getPoint());
            if (index >= 0) 
            {
                Object o = theList.getModel().getElementAt(index);
                InstantMessageDialog imd = new InstantMessageDialog(null, o.toString());
                imd.setVisible(true);
            System.out.println("Double-clicked on: " + o.toString());
            }
        }
    }
}

它应该是这样的:

http://i.stack.imgur.com/Bex5U.png

双击后,应该会出现一个新的框架(在代码 "InstantMessageDialog" 对象中)

http://i.stack.imgur.com/yjvW6.png

它应该是这样的。

所以处理掉你的上下文外代码片段,这个例子似乎工作得很好,所以我只能推测你的问题出在你的代码中你没有向我们展示的其他地方...

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JList<String> friends;

        public TestPane() {
            String names[] = {"Ana", "Banana", "Cikla", "Doris", "Ema", "Mirna", "Matea", "Veronika", "Vera", "Marta", "Mirta", "Davor", "Marko", "Matko", "Kloki"};
            JList<String> friends = new JList<String>(names);

            setLayout(new BorderLayout());
            add(new JScrollPane(friends));

            DisplayMessageDialog dmd = new DisplayMessageDialog();
            friends.addMouseListener(dmd);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.dispose();
        }

    }

    public class DisplayMessageDialog extends MouseAdapter {

        public void mouseClicked(MouseEvent e) {
            JList theList = (JList) e.getSource();
            //              if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
            if (e.getClickCount() == 2) {
                int index = theList.locationToIndex(e.getPoint());
                if (index >= 0) {
                    Object o = theList.getModel().getElementAt(index);
                            //InstantMessageDialog imd = new InstantMessageDialog(null, o.toString());
                    //imd.setVisible(true);
                    JOptionPane.showMessageDialog(theList, "Double-clicked on: " + o.toString());
                    System.out.println("Double-clicked on: " + o.toString());
                }
            }
        }
    }
}

我可能会补充说,你 "double click" 检查可能应该更像是...

if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {

假设您真的只想响应鼠标左键单击

When a name is double-clicked...

设计 GUI 时,为鼠标和键盘提供支持始终是个好主意。

查看 List Action。它为 JList 添加了 Action 支持。您需要做的就是提供 Action。然后 Action 可以通过以下方式调用:

  1. 双击,或
  2. 使用回车键。

使用 ListAction 的最基本示例是:

String[] data = { "zero", "one", "two", "three", "four", "five" };
JList list = new JList( data );

Action displayAction = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        JList list = (JList)e.getSource();
        System.out.println(list.getSelectedValue());
    }
};

ListAction la = new ListAction(list, displayAction);