Я пытаюсь создать панель вкладок, где пользователь может дважды щелкнуть вкладку, чтобы изменить ее заголовок.До сих пор мне удавалось создать компонент с вкладками, где JPanel
и JTextField
накладываются друг на друга, который переключается на JTextField
при двойном щелчке на JPanel
и обратно на JPanel
когда вы нажимаете Enter :
public class EditablePanel extends JPanel {
private JLabel label;
private JTextField field;
public EditablePanel(String title) {
super();
setLayout(new OverlayLayout(this));
setOpaque(false);
add(label = new JLabel(title));
label.setFocusable(false);
field = new JTextField(title);
field.setBorder(BorderFactory.createEmptyBorder());
field.setVisible(false);
field.addActionListener((e) -> finish(true));
add(field);
label.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
label.setVisible(false);
field.setVisible(true);
field.requestFocusInWindow();
field.selectAll();
}
}
});
}
private void finish(boolean commit) {
label.setText(field.getText());
label.setVisible(true);
field.setVisible(false);
}
}
Когда я устанавливаю компонент вкладки в JTabbedPane
на экземпляр этого EditablePanel
, я больше не могу нажимать на вкладкувыбрать его, если моя мышь находится над этикеткой.Кроме того, если LAF что-то делает, когда мышь наводит курсор на вкладку (например, меняет ее цвет, как в Windows), это прекращает применение, когда мышь находится над меткой.Я могу переключать вкладки, если щелкаю область за пределами JLabel
, но не могу, если я щелкаю один раз по JLabel
.Мне бы хотелось, чтобы это работало так, чтобы, если я щелкну один раз в любом месте вкладки, она переключится на эту вкладку, но если я дважды щелкну на вкладке, она начнет редактировать заголовок вкладки.
Я пробовалиспользуя getMouseListeners
в EditablePanel
для перенаправления событий мыши панели на JLabel
, но, похоже, они игнорируются.Есть ли способ, которым я могу использовать этот компонент в качестве компонента вкладок, сохраняя при этом существующую функциональность при наведении курсора и нажатии для изменения вкладок?Если нет, то можно ли как-нибудь расширить JTabbedPane
, чтобы получить желаемую редактируемую функцию заголовка?
Вот полный SCCM, демонстрирующий мою проблему:
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class EditablePanel extends JPanel {
private JLabel label;
private JTextField field;
public EditablePanel(String title) {
super();
setLayout(new OverlayLayout(this));
setOpaque(false);
add(label = new JLabel(title));
label.setFocusable(false);
field = new JTextField(title);
field.setBorder(BorderFactory.createEmptyBorder());
field.setVisible(false);
field.addActionListener((e) -> finish(true));
add(field);
label.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
label.setVisible(false);
field.setVisible(true);
field.requestFocusInWindow();
field.selectAll();
}
}
});
}
private void finish(boolean commit) {
label.setText(field.getText());
label.setVisible(true);
field.setVisible(false);
field.transferFocusUpCycle();
}
public static void main(String[] args) {
JFrame frame = new JFrame("Editable Tab Headers");
frame.setPreferredSize(new Dimension(400, 300));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTabbedPane pane = new JTabbedPane();
pane.addTab("First Tab", new JLabel("First tab contents"));
pane.addTab("Second Tab", new JLabel("Second tab contents"));
pane.setTabComponentAt(0, new EditablePanel("First Tab"));
pane.setTabComponentAt(1, new EditablePanel("Second Tab"));
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
}