2011-10-19 89 views
4

我一直在试图菜单中添加一个弹出来一个JTabbedPane中,我已经成功地做到如下的选项卡标题上的标签不能点击:当鼠标监听已添加

 tabbedPane.setTabComponentAt(a+2, x); 


     x.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       maybeShowPopup(e); 

      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       maybeShowPopup(e); 
      } 


      @Override 
      public void mouseExited(MouseEvent e) {} 

      @Override 
      public void mouseEntered(MouseEvent e) {} 

      @Override 
      public void mouseClicked(MouseEvent e) {} 


      private void maybeShowPopup(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        popUpMenuTab.show(e.getComponent(), 
           e.getX(), e.getY()); 
       } 
      } 

     }); 

然而,有了这个如果你右键单击你得到的上下文菜单,但如果你离开,没有什么happnes。有谁知道我怎样才能获得原始功能回到选项卡上,以便它更改为左键单击时处于活动状态,而且右键单击上下文菜单。

的SSCCE如下

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JTabbedPane; 

public class JTabbedPaneDemoextends JPanel { 
    private JPopupMenu menu = new JPopupMenu(); 

    public JTabbedPaneDemo() { 
     ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG"); 
     JTabbedPane jtbExample = new JTabbedPane(); 

     JPanel jplInnerPanel1 = createInnerPanel("Tab 1 Contains Tooltip and Icon"); 
     jtbExample.addTab("One", icon, jplInnerPanel1, "Tab 1"); 
     jtbExample.setSelectedIndex(0); 

     JPanel jplInnerPanel2 = createInnerPanel("Tab 2 Contains Icon only"); 
     jtbExample.addTab("Two", icon, jplInnerPanel2); 

     JPanel jplInnerPanel3 = createInnerPanel("Tab 3 Contains Tooltip and Icon"); 
     jtbExample.addTab("Three", icon, jplInnerPanel3, "Tab 3"); 

     JPanel jplInnerPanel4 = createInnerPanel("Tab 4 Contains Text only"); 
     jtbExample.addTab("Four", jplInnerPanel4); 

     menu.add(new JMenuItem("Item 1")); 
     menu.add(new JMenuItem("Item 2")); 

     JLabel tab4Label = new JLabel(); 
     tab4Label.setText("Four"); 

     jtbExample.setTabComponentAt(3, tab4Label); 


     tab4Label.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       maybeShowPopup(e); 

      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       maybeShowPopup(e); 
      } 


      @Override 
      public void mouseExited(MouseEvent e) {} 

      @Override 
      public void mouseEntered(MouseEvent e) {} 

      @Override 
      public void mouseClicked(MouseEvent e) {} 


      private void maybeShowPopup(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        menu.show(e.getComponent(), 
           e.getX(), e.getY()); 
       } 
      } 

     }); 


     //Add the tabbed pane to this panel. 
     setLayout(new GridLayout(1, 1)); 
     add(jtbExample); 
    } 

    protected JPanel createInnerPanel(String text) { 
     JPanel jplPanel = new JPanel(); 
     JLabel jlbDisplay = new JLabel(text); 
     jlbDisplay.setHorizontalAlignment(JLabel.CENTER); 
     jplPanel.setLayout(new GridLayout(1, 1)); 
     jplPanel.add(jlbDisplay); 
     return jplPanel; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("TabbedPane Source Demo"); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0);} 
     }); 

     frame.getContentPane().add(new JTabbedPaneDemo(), 
            BorderLayout.CENTER); 
     frame.setSize(400, 125); 
     frame.setVisible(true); 
    } 
} 

在这里,您可以点击左侧标签4,但你不能点击右键。

+0

为了更快得到更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html)。 –

+0

不确定如何在SSCCE上发帖 – Michaelb88

+0

您发布的内容不是SSCCE。 SSCCE上的链接文档的哪一部分对理解有困难? –

回答

2

更新:巧合的是,这个答案使用相同的方法@ Neifen的answer,但例如可能是值得保留。

设置选项卡式窗格模型的选定索引似乎工作:getModel().setSelectedIndex(3)。我已经更新了您的示例以使用事件调度线程,并且使其成为自包含以成为sscce

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JTabbedPane; 
import javax.swing.UIManager; 

/** @see https://stackoverflow.com/questions/7818752 */ 
public class JTabbedPaneDemo extends JPanel { 

    private JPopupMenu menu = new JPopupMenu(); 

    public JTabbedPaneDemo() { 
     Icon icon = UIManager.getIcon("html.pendingImage"); 
     final JTabbedPane jtb = new JTabbedPane(); 

     JPanel jplInnerPanel1 = createInnerPanel("Tab 1: Tooltip and Icon"); 
     jtb.addTab("One", icon, jplInnerPanel1, "Tab 1"); 
     jtb.setSelectedIndex(0); 

     JPanel jplInnerPanel2 = createInnerPanel("Tab 2: Icon only"); 
     jtb.addTab("Two", icon, jplInnerPanel2); 

     JPanel jplInnerPanel3 = createInnerPanel("Tab 3: Tooltip and Icon"); 
     jtb.addTab("Three", icon, jplInnerPanel3, "Tab 3"); 

     JPanel jplInnerPanel4 = createInnerPanel("Tab 4: Text only"); 
     jtb.addTab("Four", jplInnerPanel4); 

     menu.add(new JMenuItem("Item 1")); 
     menu.add(new JMenuItem("Item 2")); 

     JLabel tab4Label = new JLabel(); 
     tab4Label.setText("Four"); 
     jtb.setTabComponentAt(3, tab4Label); 
     tab4Label.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       maybeShowPopup(e); 

      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       maybeShowPopup(e); 
      } 

      private void maybeShowPopup(MouseEvent e) { 
       jtb.getModel().setSelectedIndex(3); 
       if (e.isPopupTrigger()) { 
        menu.show(e.getComponent(), e.getX(), e.getY()); 
       } 
      } 
     }); 

     setLayout(new GridLayout()); 
     add(jtb); 
    } 

    private JPanel createInnerPanel(String text) { 
     JPanel jplPanel = new JPanel(); 
     JLabel jlbDisplay = new JLabel(text); 
     jlbDisplay.setHorizontalAlignment(JLabel.CENTER); 
     jplPanel.setLayout(new GridLayout(1, 1)); 
     jplPanel.add(jlbDisplay); 
     return jplPanel; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("TabbedPane Source Demo"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JTabbedPaneDemo()); 
       frame.pack(); 
       frame.setSize(400, 125); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

我比他想要在每个选项卡上制作一个popup菜单都要好,这就是为什么我让听众感兴趣的东西。但是我认为这两个例子都是正确的。 – Neifen

3

这是我的解决方案:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JTabbedPane; 

public class JTabbedPaneDemo extends JPanel { 
    private JPopupMenu menu = new JPopupMenu(); 
    private JTabbedPane jtbExample; 

    public JTabbedPaneDemo() { 
     ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG"); 
     jtbExample = new JTabbedPane(); 

     JPanel jplInnerPanel1 = createInnerPanel("Tab 1 Contains Tooltip and Icon"); 
     jtbExample.addTab("One", icon, jplInnerPanel1, "Tab 1"); 
     jtbExample.setSelectedIndex(0); 

     JPanel jplInnerPanel2 = createInnerPanel("Tab 2 Contains Icon only"); 
     jtbExample.addTab("Two", icon, jplInnerPanel2); 

     JPanel jplInnerPanel3 = createInnerPanel("Tab 3 Contains Tooltip and Icon"); 
     jtbExample.addTab("Three", icon, jplInnerPanel3, "Tab 3"); 

     JPanel jplInnerPanel4 = createInnerPanel("Tab 4 Contains Text only"); 
     jtbExample.addTab("Four", jplInnerPanel4); 

     menu.add(new JMenuItem("Item 1")); 
     menu.add(new JMenuItem("Item 2")); 

     JLabel tab4Label = new JLabel(); 
     tab4Label.setText("Four"); 

     jtbExample.setTabComponentAt(3, tab4Label); 

     tab4Label.addMouseListener(new TabbedMouseListener(3)); 

     // Add the tabbed pane to this panel. 
     setLayout(new GridLayout(1, 1)); 
     add(jtbExample); 
    } 

    protected JPanel createInnerPanel(String text) { 
     JPanel jplPanel = new JPanel(); 
     JLabel jlbDisplay = new JLabel(text); 
     jlbDisplay.setHorizontalAlignment(JLabel.CENTER); 
     jplPanel.setLayout(new GridLayout(1, 1)); 
     jplPanel.add(jlbDisplay); 
     return jplPanel; 
    } 

    /** 
    * 
    * Mouselistener for the Tabbedpane 
    * 
    */ 
    class TabbedMouseListener extends MouseAdapter { 
     private final int index; 

     /** 
     * Constructor 
     * 
     * @param index 
     *   the index of the tab 
     */ 
     public TabbedMouseListener(int index) { 
      this.index = index; 
     } 

     public void mouseReleased(MouseEvent e) { 
      maybeShowPopup(e); 
     } 

     private void maybeShowPopup(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       menu.show(e.getComponent(), e.getX(), e.getY()); 
      } 
      else { 
       jtbExample.setSelectedIndex(index); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("TabbedPane Source Demo"); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     frame.getContentPane().add(new JTabbedPaneDemo(), BorderLayout.CENTER); 
     frame.setSize(400, 125); 
     frame.setVisible(true); 
    } 
} 

我已经做了监听器为一类。当您声明侦听器时,您可以将选项卡的索引作为参数。
我也做了选项卡窗格全球

+0

用于'MouseAdapter'的+1。您可能想从[EDT]开始(http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。随意克隆我的'UIManager'图标。我会敦促海报接受这个答案。 – trashgod

+0

你的意思是:'SwingUtilities.invokeAndWait(.....'然后在里面:'JFrame frame = new Jframe ...'? – Neifen

+0

是的;我在我的变体的'main()'中做了类似的事情 – trashgod