Прослушивание выбора вкладки JTabbedPane пользователемJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Прослушивание выбора вкладки JTabbedPane пользователем

Сообщение Anonymous »

Как вы прослушиваете выбор вкладок JTabbedPane пользователем?
В настоящее время мы подключаем 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 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;
private static JButton removeGreenTabButton;
private static JButton restoreGreenTabButton;

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() {
removeGreenTabButton = new JButton("Remove green tab");
removeGreenTabButton.addActionListener(e -> removeGreenTab());
return removeGreenTabButton;
}

private static void removeGreenTab() {
tabbedPane.remove(0);
restoreGreenTabButton.setEnabled(true);
removeGreenTabButton.setEnabled(false);
}

private static JButton createRestoreTabButton() {
restoreGreenTabButton = new JButton("Restore green tab");
restoreGreenTabButton.setEnabled(false);
restoreGreenTabButton.addActionListener(e -> restoreGreenTab());
return restoreGreenTabButton;
}

private static void restoreGreenTab() {
tabbedPane.insertTab("Green tab", null, createGreenPanel(), null, 0);
removeGreenTabButton.setEnabled(true);
restoreGreenTabButton.setEnabled(false);
}

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(e -> handleUserSelection());
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 void handleUserSelection() {
// this is supposed to happen only on user tab selections
System.out.println("Handling user tab selection...");
}
}
Java 8


Подробнее здесь: https://stackoverflow.com/questions/791 ... on-by-user
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»