2012-07-19 69 views
25

我正在使用JTabbedPane,我需要在選項卡中添加一個關閉按鈕來關閉當前的按鈕。如何將關閉按鈕添加到JTabbedPane選項卡?

我一直在尋找和我瞭解我必須從JPanel的延伸,正如他們所說here 添加關閉按鈕但是,有沒有辦法來添加擴展JTabbedPane的或者是有一個更簡單的方法來做到這一點的關閉按鈕?

在此先感謝,我非常感謝您的時間和您的幫助。

+1

這可能是有益的 - http://stackoverflow.com/questions/10620630/add-a-jlabel-in -jtabbedpane標題 – user1329572 2012-07-19 02:35:34

+0

謝謝我要檢查它 – Herman 2012-07-20 18:27:20

回答

39

本質上,您將需要爲該選項卡提供「渲染器」。看看JTabbedPane.setTabComponentAt(...)瞭解更多信息。

其基本思路是提供一個將在選項卡上佈局的組件。

我通常會創建一個JPanel,在其上添加一個JLabel(用於標題),並根據我想要顯示的內容創建某種類型的用作關閉操作的控件。

tabPane.addTab(title, tabBody); 
int index = tabPane.indexOfTab(title); 
JPanel pnlTab = new JPanel(new GridBagLayout()); 
pnlTab.setOpaque(false); 
JLabel lblTitle = new JLabel(title); 
JButton btnClose = new JButton("x"); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.weightx = 1; 

pnlTab.add(lblTitle, gbc); 

gbc.gridx++; 
gbc.weightx = 0; 
pnlTab.add(btnClose, gbc); 

tabPane.setTabComponentAt(index, pnlTab); 

btnClose.addActionListener(myCloseActionHandler); 

現在別的地方,我建立操作處理程序...

public class MyCloseActionHandler implements ActionListener { 

    public void actionPerformed(ActionEvent evt) { 

     Component selected = tabPane.getSelectedComponent(); 
     if (selected != null) { 

      tabPane.remove(selected); 
      // It would probably be worthwhile getting the source 
      // casting it back to a JButton and removing 
      // the action handler reference ;) 

     } 

    } 

} 

現在,你很容易地使用你喜歡的任何部件和連接鼠標監聽器,並監視鼠標點擊。 ..

更新

上面的例子將只刪除當前活動標籤,有幾個Wa的是解決這個問題。

最好是可能的行動,發現它與相關的選項卡提供一些手段......

public class MyCloseActionHandler implements ActionListener { 

    private String tabName; 

    public MyCloseActionHandler(String tabName) { 
     this.tabName = tabName; 
    } 

    public String getTabName() { 
     return tabName; 
    } 

    public void actionPerformed(ActionEvent evt) { 

     int index = tabPane.indexOfTab(getTabName()); 
     if (index >= 0) { 

      tabPane.removeTabAt(index); 
      // It would probably be worthwhile getting the source 
      // casting it back to a JButton and removing 
      // the action handler reference ;) 

     } 

    } 

} 

它使用標籤(如JTabbedPane#addTab使用)的名稱查找,然後取出標籤及其相關組件...

+0

謝謝!看起來不錯。我會在下午檢查一下。我真的很感謝你的幫助 – Herman 2012-07-20 18:29:24

+1

@Herman沒有probs :) – MadProgrammer 2012-07-20 21:16:52

+1

這就是嘗試。如果您閱讀代碼,則ActionListener正在使用選定的選項卡。您將選項卡組件與動作偵聽器相關聯,找到索引並將其刪除,而不是 – MadProgrammer 2013-05-17 23:24:36

6

我發現一個標籤示例(來自java網站),似乎這樣做,至少在他們的。 (雖然我認爲,當我在過去嘗試它時,它也關閉了當前選定的選項卡,儘管它在運行它們的示例時正常工作,但我認爲當我更新它以在選項卡式的Java記事本上工作時,它正在關閉當前選定的選項卡,但也許我沒有錯。

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ButtonTabComponent.java

是的,我的事情現在工作!這會工作的實際標籤,而不是當前選定的選項卡!

+0

雖然,你應該知道,這樣做會破壞你設置標籤圖標的能力。 (除非你想去和下層的混亂,看看源代碼,做paintComponent()和所有有趣的東西,我看不到解決這個問題的方法。) – MongooseLover 2013-11-29 02:34:45

0

希望你已經得到了你的問題的答案,我想給一個對我非常有用的鏈接

JTabbedPane with a close button

下面是一些代碼。

public static void createAndShowGUI() 
{ 
    JFrame frame = new JFrame("Tabs"); 
    frame.setMinimumSize(new Dimension(500, 200)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JTabbedPane tabbedPane = new JTabbedPane(); 

    JPanel panel = new JPanel(); 
    panel.setOpaque(false); 
    tabbedPane.add(panel); 
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel), getTitlePanel(tabbedPane, panel, "Tab1")); 

    JPanel panel1 = new JPanel(); 
    panel1.setOpaque(false); 
    tabbedPane.add(panel1); 
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel1), getTitlePanel(tabbedPane, panel1, "Tab2")); 

    JPanel panel2 = new JPanel(); 
    panel2.setOpaque(false); 
    tabbedPane.add(panel2); 
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel2), getTitlePanel(tabbedPane, panel2, "Tab3")); 

    JPanel panel3 = new JPanel(); 
    panel3.setOpaque(false); 
    tabbedPane.add(panel3); 
    tabbedPane.setTabComponentAt(tabbedPane.indexOfComponent(panel3), getTitlePanel(tabbedPane, panel3, "Tab4")); 

    frame.add(tabbedPane); 

    // Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
} 
0

我在oracle的代碼中做了一些修改。

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ButtonTabComponent.java

給可能性的圖標添加到標籤,再加上靠近標籤按鈕。希望有所幫助。

public static void addTag(JTabbedPane tab, String title, Icon icon, int index){ 
    MouseListener close = new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      //your code to remove component 
      //I use this way , because I use other methods of control than normal: tab.remove(int index); 
     } 

    }; 
    final ButtonClose buttonClose = new ButtonClose (title, icon, close); 

    tab.setTabComponentAt(index, buttonClose); 
    tab.validate(); 
    tab.setSelectedIndex(index); 

}

公共類ButtonClose擴展JPanel {

public ButtonClose(final String title, Icon icon, MouseListener e) { 
    JLabel ic = new JLabel(icon); 
    ic.setSize(icone.getIconWidth(), icone.getIconHeight()); 

    JLabel text= new JLabel(title); 
    text.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); 

    ButtonTab button = new ButtonTab(); 
    button.addMouseListener(e); 
    button.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); 

    JPanel p = new JPanel(); 
    p.setSize(getWidth() - icone.getIconWidth(), 15); 
    p.add(text); 
    p.add(button); 

    add(ic); 
    add(p); 
} 

private class ButtonTab extends JButton { 

    public ButtonTab() { 
     int size = 13; 
     setPreferredSize(new Dimension(size, size)); 
     setToolTipText("Close"); 

     setUI(new BasicButtonUI()); 

     setFocusable(false); 
     setBorderPainted(false); 

     addMouseListener(listener); 
     setRolloverEnabled(true); 
    } 

    @Override 
    public void updateUI() { 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 

     if (getModel().isPressed()) { 
      g2.translate(1, 1); 
     } 
     g2.setStroke(new BasicStroke(2)); 
     g2.setColor(new Color(126, 118, 91)); 

     if (getModel().isRollover()) { 
      g2.setColor(Color.WHITE); 
     } 

     int delta = 3; 
     g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1); 
     g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1); 
     g2.dispose(); 
    } 
} 

private final MouseListener listener = new MouseAdapter() { 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     Component component = e.getComponent(); 
     if (component instanceof AbstractButton) { 
      AbstractButton button = (AbstractButton) component; 
      button.setContentAreaFilled(true); 
      button.setBackground(new Color(215, 65, 35)); 
     } 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     Component component = e.getComponent(); 
     if (component instanceof AbstractButton) { 
      AbstractButton button = (AbstractButton) component; 
      button.setContentAreaFilled(false); //transparent 
     } 
    } 
}; 

}

0

退房彼得 - 搖擺here。它有一個JClosableTabbedPane類,以及許多其他。

當你下載jar文件時,你可以運行它並且有所有類的例子。

0

你可以有一個名爲的JLabel 「x」 和使用的MouseListener

private final JLabel l = new JLabel(); // this is the label for tabbedPane 
private final JLabel b = new JLabel("x");//Close Button 
if (closeable) 
     { 
      b.setToolTipText("Click to close"); 

      b.setOpaque(false); 
      b.setBackground(Color.gray); 

      b.addMouseListener(new MouseAdapter() 
      { 
       @Override 
       public void mouseExited(MouseEvent e) 
       { 
        b.setBorder(bordere); 
        b.setOpaque(false); 
       } 

       @Override 
       public void mouseEntered(MouseEvent e) 
       { 
        b.setBorder(borderl); 
       } 

       @Override 
       public void mouseReleased(MouseEvent e) 
       { 
        b.setOpaque(false); 
        b.repaint(); 

        if (b.contains(e.getPoint())) 
        { 
         b.setBorder(borderl); 

         if (confirmTabClosing()) 
         { 
          tab.remove(tabIndex()); 
          if(tab.getTabCount() == 0) 
           spacialTabComponent.maximizeOrRestore.doClick(); 
         } 
        } 
        else 
         b.setBorder(bordere); 

       } 

       @Override 
       public void mousePressed(MouseEvent e) 
       { 
        b.setOpaque(true); 
        b.repaint(); 
       } 
      }); 

      b.setBorder(bordere); 
      add(b, getLeftAlignedBothFilledGBC(1, 0, new Insets(0, 0, 0, 0), 0, 0)); 
     } 



    } 
0
jbCloseButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton); 
       jtbMainTabbedPane.remove(index); 
      } 
}); 
相關問題