В настоящее время мы подключаем ChangeListener, но проблема в ChangeEvent публикуются, даже если пользователь не выбирает вкладку. В частности, он публикуется при удалении вкладки и перерасчете индексов вкладки. Когда это произойдет, мы не хотим выполнять ту же логику, которую мы должны выполнять при выборе пользователя. Не хочу вдаваться в подробности (они вас только запутают), но это вызывает в нашем приложении один досадный баг, дело не только в производительности
Чтобы доказать это, позвольте мне показать вам фрагмент метода javax.swing.JTabbedPane#removeTabAt
Код: Выделить всё
// triggers ChangeEvent
if (selected > index) {
setSelectedIndexImpl(selected - 1, false);
Вот MRE:
Код: Выделить всё
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
public class TabbedPaneDemo {
private static JTabbedPane tabbedPane;
public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("Tabbed Pane demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static JComponent createMainPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(createButtonPanel(), BorderLayout.NORTH);
panel.add(createTabbedPane());
return panel;
}
private static JPanel createButtonPanel() {
JPanel panel = new JPanel();
panel.add(createRemoveTabButton());
panel.add(createRestoreTabButton());
return panel;
}
private static JButton createRemoveTabButton() {
JButton button = new JButton("Remove green tab");
button.addActionListener(e -> tabbedPane.remove(0));
return button;
}
private static JButton createRestoreTabButton() {
JButton button = new JButton("Restore green tab");
button.addActionListener(e -> tabbedPane.insertTab("Green tab", null, createGreenPanel(), null, 0));
return button;
}
private static JTabbedPane createTabbedPane() {
tabbedPane = new JTabbedPane();
tabbedPane.addTab("Green tab", createGreenPanel());
tabbedPane.addTab("Red tab", createRedPanel());
tabbedPane.setPreferredSize(new Dimension(250, 150));
tabbedPane.addChangeListener(createChangeListener());
return tabbedPane;
}
private static Component createGreenPanel() {
JPanel panel = new JPanel();
panel.setBackground(Color.GREEN);
return panel;
}
private static Component createRedPanel() {
JPanel panel = new JPanel();
panel.setBackground(Color.RED);
return panel;
}
private static ChangeListener createChangeListener() {
// this is supposed to happen only on user tab selections
return e -> System.out.println("Handling user tab selection...");
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... on-by-user
Мобильная версия