Java 双击JList元素上的事件
我有个问题,我自己找不到答案。 我正在用java进行一次简单的聊天,我用名字填充了一个JList。双击名称时,需要将该名称作为参数传递给另一个框架(作为收件人名称)。但是,双击不起作用 我有一个主类InstantMessageFrame,其中名为friends的JList被初始化并用字符串数组填充Java 双击JList元素上的事件,java,swing,mouseevent,jlist,Java,Swing,Mouseevent,Jlist,我有个问题,我自己找不到答案。 我正在用java进行一次简单的聊天,我用名字填充了一个JList。双击名称时,需要将该名称作为参数传递给另一个框架(作为收件人名称)。但是,双击不起作用 我有一个主类InstantMessageFrame,其中名为friends的JList被初始化并用字符串数组填充 private JList<String> friends; String names[] = { "Ana", "Banana", "Cikla", "Doris", "Ema", "M
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);
这是我的DisplayMessageDialog类,它检查是否有双击。如果双击,将显示一个新帧。第一个“if”语句中的任何一行都不会执行(其中一行带有e.getClickCount()
它应该是这样的:
双击时,会出现一个新的帧(在代码“InstantMessageDialog”对象中)
它应该是这样的。因此,通过处理上下文之外的代码片段,这个示例似乎可以很好地工作,因此我只能猜测,您的问题在于代码中没有向我们展示的其他地方
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());
}
}
}
}
}
假设您真的只想响应鼠标左键单击
双击名称时
在设计GUI时,为鼠标和键盘提供支持总是一个好主意
退房。它将操作
支持添加到JList
。您只需提供操作
。然后可以通过以下方式调用操作
:
ListAction
中的mouseClicked
方法更改为mousePressed
mousePressed
事件更可靠,因为只有在为同一像素生成mousePressed/mouseerelease事件时才会生成mouseClicked
事件。因此,如果鼠标移动1个像素,则不会生成鼠标单击事件。“但是,双击不起作用…”
--请详细说明,因为“不起作用”本身对我们来说非常令人沮丧,因为它告诉我们没有任何用处。你这到底是什么意思?它怎么不起作用?你遇到了什么问题?您尝试调试此文件时发现了什么?也可以考虑发布A。我的意思是不起作用。当我双击JLIST中的名字时,什么都没有改变,没有任何事情发生,就像我没有给JLISTAY添加一个侦听器来提供一个演示你的问题一样。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应。我认为您需要创建并发布您的日志,以便我们猜测哪些不起作用。请点击链接。请重新阅读由两位不同的Swing专家给出的4次链接。如果链接中的任何内容让您感到困惑,请要求澄清。我测试了该程序,并将我的一些代码更改为您的代码,并意识到问题出在我的getFriendsPane中,我将JList friends添加到JScrollPane中,因此我删除了我的方法,并将其替换为add(新的JScrollPane(friends));
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());
}
}
}
}
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());
}
}
}
}
}
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {