我正在使用JTabbedPane,我需要在選項卡中添加一個關閉按鈕來關閉當前的按鈕。如何將關閉按鈕添加到JTabbedPane選項卡?
我一直在尋找和我瞭解我必須從JPanel的延伸,正如他們所說here 添加關閉按鈕但是,有沒有辦法來添加擴展JTabbedPane的或者是有一個更簡單的方法來做到這一點的關閉按鈕?
在此先感謝,我非常感謝您的時間和您的幫助。
我正在使用JTabbedPane,我需要在選項卡中添加一個關閉按鈕來關閉當前的按鈕。如何將關閉按鈕添加到JTabbedPane選項卡?
我一直在尋找和我瞭解我必須從JPanel的延伸,正如他們所說here 添加關閉按鈕但是,有沒有辦法來添加擴展JTabbedPane的或者是有一個更簡單的方法來做到這一點的關閉按鈕?
在此先感謝,我非常感謝您的時間和您的幫助。
本質上,您將需要爲該選項卡提供「渲染器」。看看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
使用)的名稱查找,然後取出標籤及其相關組件...
謝謝!看起來不錯。我會在下午檢查一下。我真的很感謝你的幫助 – Herman 2012-07-20 18:29:24
@Herman沒有probs :) – MadProgrammer 2012-07-20 21:16:52
這就是嘗試。如果您閱讀代碼,則ActionListener正在使用選定的選項卡。您將選項卡組件與動作偵聽器相關聯,找到索引並將其刪除,而不是 – MadProgrammer 2013-05-17 23:24:36
我發現一個標籤示例(來自java網站),似乎這樣做,至少在他們的。 (雖然我認爲,當我在過去嘗試它時,它也關閉了當前選定的選項卡,儘管它在運行它們的示例時正常工作,但我認爲當我更新它以在選項卡式的Java記事本上工作時,它正在關閉當前選定的選項卡,但也許我沒有錯。
是的,我的事情現在工作!這會工作的實際標籤,而不是當前選定的選項卡!
雖然,你應該知道,這樣做會破壞你設置標籤圖標的能力。 (除非你想去和下層的混亂,看看源代碼,做paintComponent()和所有有趣的東西,我看不到解決這個問題的方法。) – MongooseLover 2013-11-29 02:34:45
希望你已經得到了你的問題的答案,我想給一個對我非常有用的鏈接
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);
}
我在oracle的代碼中做了一些修改。
給可能性的圖標添加到標籤,再加上靠近標籤按鈕。希望有所幫助。
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
}
}
};
}
退房彼得 - 搖擺here。它有一個JClosableTabbedPane
類,以及許多其他。
當你下載jar
文件時,你可以運行它並且有所有類的例子。
你可以有一個名爲的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));
}
}
jbCloseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int index = jtbMainTabbedPane.indexOfTabComponent(jbCloseButton);
jtbMainTabbedPane.remove(index);
}
});
這可能是有益的 - http://stackoverflow.com/questions/10620630/add-a-jlabel-in -jtabbedpane標題 – user1329572 2012-07-19 02:35:34
謝謝我要檢查它 – Herman 2012-07-20 18:27:20