Получить вкладку в фокусе после закрытия вкладки - PullRequest
0 голосов
/ 01 октября 2018

В JTabbedPane я связывал пользовательский объект Data с каждой добавленной вкладкой.У меня также есть соответствующий объект метаданных, который отображается на другой панели при выборе вкладки.Проблема, с которой я столкнулся сейчас, заключается в том, что когда вкладка закрыта, на панели метаданных отображаются метаданные объекта Data на только что закрытой вкладке.В идеале я хочу, чтобы на панели отображались метаданные для вкладки в фокусе, которую видит пользователь.Однако действие по закрытию вкладки означает, что «выбранная вкладка» является закрытой вкладкой, поэтому tabpane.getSelectedIndex() не будет работать.Как я могу получить вкладку, которая находится в фокусе после закрытия вкладки?Заранее спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Дьявол кроется в деталях, которых вы не предоставили ни одного.

Я сделал быстрый тест и обнаружил, что ChangeListener вызывается раньше ContainerListener, что является настоящей болью, но это всегда былосообщение о правильном индексе.

Итак, вам нужно объединить два вместе, чтобы оба обновили панель метаданных при их вызове.

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTabbedPane tabbedPane = new JTabbedPane();
                tabbedPane.addTab("One", new TabPane(tabbedPane));
                tabbedPane.addTab("Two", new TabPane(tabbedPane));
                tabbedPane.addTab("Three", new TabPane(tabbedPane));
                tabbedPane.addTab("Four", new TabPane(tabbedPane));

                tabbedPane.addContainerListener(new ContainerListener() {
                    @Override
                    public void componentAdded(ContainerEvent e) {
                    }

                    @Override
                    public void componentRemoved(ContainerEvent e) {
                        System.out.println("Removed " + e.getChild());

                    }
                });

                tabbedPane.addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        System.out.println(tabbedPane.getSelectedIndex());
                    }
                });

                JFrame frame = new JFrame();
                frame.add(tabbedPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TabPane extends JPanel {
        private JTabbedPane parent;

        public TabPane(JTabbedPane parent) {
            this.parent = parent;
            setLayout(new GridBagLayout());
            JButton btn = new JButton("Close");
            add(btn);

            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    parent.remove(TabPane.this);
                }
            });
        }

    }

}
...