当前位置: 首页 > 知识库问答 >
问题:

JList对象中的MouseEvents

简宏义
2023-03-14
 public WifiGuiHandler(JButton reference) {
    btnReference = reference;
    wifiListener = new WifiListener();
    wifiPopupContainer = new JScrollPopupMenu("Connections.");
    wifiPopupContainer.setMaximumVisibleRows(7);
    connectionsHolder = new ArrayList<>();
    listOfConnections = new JList();
    listOfConnectionsModel = new ListModel(connectionsHolder);
    listOfConnectionsRenderer = new ListRenderer();
    listOfConnections.setModel(listOfConnectionsModel);
    listOfConnections.setCellRenderer(listOfConnectionsRenderer);
    wifiPopupContainer.add(listOfConnections);
    wifiPopupContainer.pack();
    initializeTestVariables();
    initializeListeners();
}

这里,类的构造函数接受JButton并向其添加鼠标侦听器,从而触发JPopupMenu,该JPopupMenu只有一个组件,即保存整个数据的JList。此外,将带有数据项的ArrayList链接到ListModel。

public void initializeTestVariables() {
    for (int i = 0; i <= 10; i++) {
        WifiItem item = new WifiItem("Connection number " + i + ".", i);
        connectionsHolder.add(item);
    }
}

设置数据项。

public void initializeListeners() {

    listOfConnections.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            int index = listOfConnections.locationToIndex(e.getPoint());
            if (index >= 0) {
                WifiItem item = (WifiItem) ((ListModel) listOfConnections.getModel()).getElementAt(index);
                System.out.println("Button of " + item.getConnectionName() + " is at location :" + item.getButton().getLocation());
                System.out.println("Button has the bounds : " + item.getButton().getBounds());
                System.out.println("MouseEvent detected on : " + e.getPoint().getLocation());
                if (item.getButton().getBounds().contains(e.getPoint())) {
                    item.connectHere();
                }
                if (item.getButton().isVisible()) {
                    System.out.println("Set expanded on : " + item.getConnectionName());
                    item.setExpandedState(false);
                    listOfConnectionsModel.fireContentsChanged(item, index, index);
                    updateGui(false);
                } else {
                    System.out.println("Set expanded on : " + item.getConnectionName());
                    listOfConnectionsModel.fireContentsChanged(item, index, index);
                    item.setExpandedState(true);
                    updateGui(false);
                }
            }
        }

    });
    btnReference.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            updateGui(true);
        }
    });

}

这就是混乱产生的地方。我从鼠标事件位置/点正确地获取了数据项(WifiItem),但是当我单击WifiItem的JButton时,它不会触发该方法,就像它似乎没有检测到JButton实际上在那里一样。我还设置了打印,奇怪的是,JButton的点总是相同的,尽管它实际上是不同的,这似乎是问题所在。更确切地说,从程序的输出来看:

另一个打印显示,所有的JButtons都有相同的点和矩形,我不明白。JList中有10个项,每个项都正确显示,如何使它们的所有JButtons具有相同的位置?我一定是漏掉了一些关键因素。我查看了其他文章并尝试了其他建议:使用SwingUtilities转换point,从JList中删除所有鼠标侦听器并将它们添加到数据项中。

总而言之,问题在于列表会为其中正确的数据项触发事件(这意味着,我确实获得了位于其中的项的正确索引),但是如果鼠标事件发生在列表中任何数据项的JButton上,它不会触发所需的效果(点不在按钮的边界上,尽管它应该是这样)。

共有1个答案

包唯
2023-03-14

更确切地说,我为列表添加了一个鼠标侦听器,但如果鼠标点位于JButton的边界内,我希望它触发一些东西,如果鼠标点位于数据项上,我希望它触发另一个操作。

一个更简单的解决方案是使用JTable。数据被分成几列,JTable有一个API让您知道选择了哪一行/哪列。

您可以使用表按钮列作为按钮的呈现器/编辑器

 类似资料:
  • 我正在尝试填充一个jList,我希望它显示一个名称,但也为列表中的每个项目存储一个ID(未显示)。 干杯。

  • 我正在进行一个项目,我应该创建一个应用程序,该应用程序会获取信息并将其存储在JList中,当我在JList中选择一个人的姓名时,它应该会显示此人的联系信息 我制作了两个类,一个是contact类,另一个是JFrame类。 这是接触类 然后这是我正在处理的添加按钮的代码。 我只是需要帮助添加到JList中的联系人类,并且能够在JList上显示第一个和最后一个名字。谢谢你提前帮助我

  • 我在Netbeans构建了一个Java项目。我有一个表单,表单内部有一个jList,其中填充了一个对象(Favorite)。我也有一个按钮,我想当我按下按钮删除选定的项目在jList。 我正在尝试以下代码,但我得到一个错误。 我得到以下错误: 线程“AWT-EventQueue-0”中出现异常Java . lang . classcastexception:Java . lang . string

  • 当我用将file对象添加到用于创建JList的DefaultListModel中时,JList中显示的文本是文件的路径。但我只想显示文件名。但是,我不能执行,因为稍后我需要访问file对象,而不仅仅是一个字符串。

  • 问题内容: 我有一个包含自定义对象的ArrayList的JList,我试图创建拖放到字段中。我无法理解如何在Transferable中打包和接收对象。 据我所知: 澄清:我在从JList中选择对象并从中创建一个Transferable时遇到麻烦。使用上面的代码,对象的toString表示形式只是粘贴在文本字段中,因此我无法从放置的位置提取对象数据。如何“打包”对象本身并将其放入可以从GUI引用对象

  • 问题内容: 我有一个ArrayList,随着更多用户加入聊天室而变得越来越大。主JFrame有一个列表框,显示所有当前连接的用户。但是当我尝试将arraylist传递到jframe列表中时,出现以下错误: “ JList类型的方法setListData(Object [])不适用于参数(ArrayList)” 谢谢你的时间。 问题答案: 您可以简单地使用 或者,您也可以编写自己的,例如,由来支持…