По сути, вам нужно будет предоставить «рендерер» для вкладки. Взгляните на 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 ;)
}
}
}
Теперь вы так же легко можете использовать любой компонент, который вам нравится, и прикрепить к нему прослушиватель мыши и отслеживать щелчки мыши...
Обновлено
В приведенном выше примере будет удалена только активная в данный момент вкладка, есть несколько способов исправить это.
Лучше всего, вероятно, предоставить какие-то средства для действия, чтобы найти вкладку, с которой оно связано...
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
), чтобы найти, а затем удалить вкладку и связанный с ней компонент...
person
MadProgrammer
schedule
19.07.2012