Java JTabbedPane-无法删除单个选项卡

Java JTabbedPane-无法删除单个选项卡,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我有一个简单的JTabbedPane,显示文本文件。每个选项卡都包含一个JList包装在JScrollPane中。我希望能够通过右键单击来关闭各个选项卡,但我无法实现这个看似简单的行为 以下是我到目前为止所做的尝试: 将侦听器添加到窗格中 public class RightClickListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (SwingUtilities.isR

我有一个简单的
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()));
        }
    }
}
public void loadCode(字符串cFile,字符串cLine){
扫描仪扫描=空;
试一试{
扫描=新扫描仪(新文件(cFile));
}catch(FileNotFoundException e){e.printStackTrace();}
DefaultListModel=新的DefaultListModel();
JList列表=新的JList(型号);
while(scan.hasNext()){
model.addElement(scan.nextLine());
}
JScrollPane newTab=新的JScrollPane(列表);
tp.添加(cFile、newTab);
tp.addMouseListener(新的RightClickListener());
}
公共类RightClickListener扩展了MouseApter{
公共无效mouseClicked(MouseEvent e){
if(SwingUtilities.isRightMouseButton(e)){
移除(索引位置(e.getX(),e.getY());
}
}
}

现在,在您的侦听器中,您正在使用
getComponentAt
——它将在单击点返回组件(如果您单击选项卡标题,您将返回JTabbedPane)。由于JTabbedPane从未添加到自身,因此它无法删除该组件

尝试改用
indexateLocation
方法-这将检查单击的x/y坐标是否对应于选项卡标题,并返回该选项卡的索引(有关更多详细信息,请参阅)


您是否调用了
tabbedPane.addMouseListener(新的RightClickListener())?我觉得这非常接近我所需要的,但出于某种原因,在当前索引正常后,这会删除每个选项卡。因此,如果我删除选项卡2,它将删除
3,4。。。n
也是。嗯。。。在我的演示中,它不是这样的。为了确保JTabbedPane或其组件上没有任何其他能够删除的鼠标侦听器,是吗?这是一个延伸,但您只添加了一个MouseAdapter,对吗?如果有多个,它将删除许多选项卡。如果您只有一个MouseAdapter,那么您需要发布更多的代码(由于此解决方案在本地工作,我会瞎飞)。我怀疑问题出在别的地方。天哪,我知道了。我需要在构造函数中设置该侦听器。我加载多个文本文件,因此它不断添加侦听器。非常感谢。
public class RightClickListener extends MouseAdapter {
    public void mouseClicked(MouseEvent e) {
        if (SwingUtilities.isRightMouseButton(e)) {
            tp.remove(tp.indexAtLocation(e.getX(), e.getY()));
        }
    }
}