JAVA如何通过mousePosition从JTabbedPane获取Tab

时间:2016-12-19 15:46:20

标签: java swing mouselistener jtabbedpane

刚刚遇到这个问题。给我带来SSCE! :-)

我想通过双击标题"标题"来获取标签内容(组件)。

我给你这个SSCE,在这种情况下,我希望通过双击选项卡菜单标题来接收JLabel。 (绿色标签),我想收到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的功能..所以当你双击"标题"它将打开一个对话框,其中包含您双击的Tab的内容。

我知道如何创建对话框等等。但我不知道如何通过鼠标点击标题来获取组件。

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分: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));

  }
}