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上,它不会触发所需的效果(点不在按钮的边界上,尽管它应该是这样)。
更确切地说,我为列表添加了一个鼠标侦听器,但如果鼠标点位于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)” 谢谢你的时间。 问题答案: 您可以简单地使用 或者,您也可以编写自己的,例如,由来支持…