You want to do something like this:
Component descendant = tabPane.getDescendantAt(x, y);
if (descendant instanceof TerraTabPaneSkin.TabButton) {
int tabIndex = descendant.getParent().indexOf(descendant);
tabPane.getTabs().remove(tabIndex);
}
On May 13, 2011, at 8:09 AM, Edvin Syse wrote:
> .. or maybe you meant:
>
> tabs.getTabs().indexOf(descendant.getParent()).. but that returns -1. The
> parent of descendant isn't the argument to tabPane.remove(), as far as I
> understand, the descendant has a child (in the field member tab) that is the
> actual component I can remove.
>
> Den 13.05.2011 14:06, skrev Edvin Syse:
>> Can't get my head around that one... The button is descendant in my example,
>> right? You want me to call descendant.getParent().indexOf(), but what is the
>> argument to indexOf()?
>>
>> Den 13.05.2011 13:56, skrev Greg Brown:
>>> Again, this is a hack, but since you have the tab button, you can call
>>> indexOf() on the button's parent to get the tab index. That way you don't
>>> need to use reflection.
>>>
>>> On May 13, 2011, at 7:52 AM, Edvin Syse wrote:
>>>
>>>> Got it, thanks :) I had to use reflection to get the correct argument for
>>>> tabPane.remove(), does it look right to you?
>>>>
>>>>
>>>> tabPane.getComponentMouseButtonListeners().add(new
>>>> ComponentMouseButtonListener.Adapter() {
>>>> public boolean mouseClick(Component component, Mouse.Button
>>>> button, int x, int y, int count) {
>>>> Component descendant = tabPane.getDescendantAt(x, y);
>>>> if (descendant instanceof TerraTabPaneSkin.TabButton&&
>>>> button == Mouse.Button.MIDDLE) {
>>>> try {
>>>> Field tabField =
>>>> TerraTabPaneSkin.TabButton.class.getDeclaredField("tab");
>>>> tabField.setAccessible(true);
>>>> tabPane.getTabs().remove((Component)
>>>> tabField.get(descendant));
>>>> } catch (Exception ignored) {
>>>> }
>>>> }
>>>> return false;
>>>> }
>>>> });
>>>>
>>>>
>>>> Den 13.05.2011 13:34, skrev Greg Brown:
>>>>> Since the buttons are effectively private to the tab pane's skin, the
>>>>> "right" way to do this would probably be to create a custom subclass of
>>>>> TerraTabPaneSkin that knows about the buttons and can attach a listener
>>>>> to them. However, you could probably hack support for this by registering
>>>>> a mouse listener on the TabPane itself, then calling
>>>>> tabPane.getComponentAt(x, y). If the component is an instance of
>>>>> TerraTabPaneSkin.TabButton, then the user has clicked on the tab button.
>>>>>
>>>>> On May 13, 2011, at 2:53 AM, Edvin Syse wrote:
>>>>>
>>>>>> I would like a middle mousebutton click to close the active tab in a
>>>>>> TabPane, using the same action that happens when one click the X in the
>>>>>> tab. Where should I attach a listener to make this happen?
>>>>>>
>>>>>> -- Edvin