1

JTabbedPaneテキストファイルを表示するシンプルなものがあります。各タブには、右クリックで個々のタブを閉じることができるようにしたいのですが、この一見単純な動作を機能させることができませんJListJScrollPane

これが私がこれまでに試したことです:

ペインにリスナーを追加する

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 に答える