2016-12-19 7 views
1

Только что пришел к этой проблеме. Приносит SSCE со мной! :-)JAVA Как получить вкладку из JTabbedPane by mousePosition

Я хотел бы получить содержимое вкладки (компонент), дважды щелкнув по его «заголовку».

Я даю вам этот SSCE, и в этом случае я хотел бы получить JLabel, дважды щелкнув по названию tab-menu. (Green Tab), и я хотел бы получить JLabel «Я - лейбл 2!». enter image description here

есть код:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SSCE extends JFrame { 

private JTabbedPane tab; 
public SSCE() { 
    tab = new JTabbedPane(); 
    this.add(tab); 
    JLabel p = new JLabel("I am label 1!"); 
    tab.addTab("Red tab",p); 

    JLabel p2 = new JLabel("I am label 2!"); 
    tab.addTab("Green tab",p2); 

    JLabel p3 = new JLabel("I am label 3!"); 
    tab.addTab("Blue tab",p3); 

    JLabel p4 = new JLabel("I am label 4!"); 
    tab.addTab("Cyan tab", p4); 

    tab.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mousePressed(MouseEvent e) { 
      if (e.getClickCount() > 1) { 
       Component c = tab.getComponentAt(new Point(e.getX(), e.getY())); 
       //TODO Find the right label and print it! :-) 
       JLabel innerComponent = (JLabel) c; 
       System.out.println("Found:" + innerComponent.getText()); 
      } 
     } 
    }); 
} 

    public static void main(final String[] args) throws Exception { 
     SSCE start = new SSCE(); 
     start.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     start.setVisible(true); 
     start.setSize(new Dimension(450,300)); 

    } 
} 

Можно ли сделать это как-то? Я пробовал много всего. Но не повезло :-( Огромное вам спасибо за помощь!

Что я пытаюсь сделать, это реализовать функциональность JTabbedPane. Поэтому, когда вы дважды щелкаете по «Title», он откроет диалог с содержанием вкладки вы дважды нажал на.

Я знаю, как создать диалог и так далее .. Но я не знаю, как получить компонент только с щелчком мышью по названию.

ответ

3
Component c = tab.getComponentAt(new Point(e.getX(), e.getY())); 

Вы не хотите получать компонент, на который вы нажимаете. Вы хотите получить компонент с выбранной вкладки.

Код должен быть:

//int index = tab.getSelectedTab(); // oops, this was a typo 
int index = tab.getSelectedIndex(); 
Component c = tab.getComponentAt(index); 
+0

Ну а .getSelectedTab() не дает вкладку Проппер, если дважды щелкнуть на не выбранную вкладку она по-прежнему дает тот, который выбран в данный момент, а не тот, который вы нажали at: -/ – MrDoda

+0

Я ищу способ получить компонент внутри вкладки, дважды щелкнув по «Заголовок». Должен быть способ ... Когда вы нажимаете на него, открывается правая вкладка. Так что это также могло бы дать вы знаете, что скрывается за «заголовком» :-( – MrDoda

+0

Я пытаюсь реализовать функции JTabbedPane. Поэтому, когда вы дважды щелкните по «Title», он откроет диалог с содержимым Вставьте двойное нажатие. – MrDoda

2

как получить компонент только с щелчком мышью по названию.

Я думаю, вы ищете JTabbedPane#indexAtLocation(int, int)?

Возвращает индекс вкладок, соответствующий вкладке, границы которой пересекают указанное местоположение. Возвращает -1, если вкладка не пересекает местоположение.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SSCE2 extends JFrame { 

    private JTabbedPane tab; 
    public SSCE2() { 
    tab = new JTabbedPane(); 
    this.add(tab); 
    JLabel p = new JLabel("I am label 1!"); 
    tab.addTab("Red tab", p); 

    JLabel p2 = new JLabel("I am label 2!"); 
    tab.addTab("Green tab", p2); 

    JLabel p3 = new JLabel("I am label 3!"); 
    tab.addTab("Blue tab", p3); 

    JLabel p4 = new JLabel("I am label 4!"); 
    tab.addTab("Cyan tab", p4); 

    tab.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
     if (e.getClickCount() > 1) { 
      //Component c = tab.getComponentAt(new Point(e.getX(), e.getY())); 
      //TODO Find the right label and print it! :-) 
      int index = tab.indexAtLocation(e.getX(), e.getY()); 
      if (index >= 0) { 
      Component c = tab.getComponentAt(index); 
      if (c instanceof JLabel) { 
       JLabel innerComponent = (JLabel) c; 
       System.out.println("Found:" + innerComponent.getText()); 
      } 
      } 
     } 
     } 
    }); 
    } 

    public static void main(final String[] args) throws Exception { 
    JFrame start = new SSCE2(); 
    start.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    start.setVisible(true); 
    start.setSize(new Dimension(450, 300)); 

    } 
} 
+0

Благодарим вас за это :-) Cant mark 2 ppl как правильный ответ. Так что примите хотя бы мое спасибо – MrDoda