1

我有一个简单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()));
        }
    }
}
4

1 回答 1

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()));
        }
    }
}
于 2012-07-13T19:51:51.560 回答