JTabbedPane - 无法删除单个选项卡

时间:2012-07-13 19:21:22

标签: java swing jtabbedpane

我有一个显示文本文件的简单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()));
        }
    }
}

1 个答案:

答案 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()));
        }
    }
}