我有一个显示文本文件的简单JTabbedPane
。每个标签都包含一个JList
包裹在JScrollPane
中我希望能够通过右键单击关闭各个标签,但我无法让这种看似简单的行为起作用。
这是我到目前为止所尝试的内容:
向窗格添加监听器
public class RightClickListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
remove(getComponentAt(e.getPoint()));
}
}
}
添加到各个标签页
public class RightClickListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
remove((Component) e.getSource());
}
}
}
我尝试了其他几种变体,似乎没有任何效果。有谁知道为什么这些组件没有被删除?我很乐意在必要时提供任何其他详细信息。
更新更多详情:
public void loadCode(String cFile, String cLine) {
Scanner scan = null;
try {
scan = new Scanner(new File(cFile));
} catch (FileNotFoundException e) { e.printStackTrace();}
DefaultListModel<String> model = new DefaultListModel<String>();
JList<String> list = new JList<String>(model);
while(scan.hasNext()) {
model.addElement(scan.nextLine());
}
JScrollPane newTab = new JScrollPane(list);
tp.add(cFile, newTab);
tp.addMouseListener(new RightClickListener());
}
public class RightClickListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
remove(indexAtLocation(e.getX(), e.getY()));
}
}
}
答案 0 :(得分:2)
现在在你的听众中,你正在使用getComponentAt
- 它将在点击的点返回组件(如果你点击标签标题,你将得到JTabbedPane返回)。由于JTabbedPane从未添加到自身,因此无法删除该组件......
尝试使用indexAtLocation
方法 - 这将检查点击的x / y坐标是否对应于标签标题并返回该标签的索引(有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/api/javax/swing/JTabbedPane.html)
public class RightClickListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
tp.remove(tp.indexAtLocation(e.getX(), e.getY()));
}
}
}