У меня есть приложение, которое вложило JTabbedPanes.Каждый из JTabbedPanes включает в себя другие JTabbedPanes.
Я хочу кое-что проверить, прежде чем позволить пользователю покинуть текущую вкладку.
Когда вы запустите приведенный ниже код, вы увидите, что Months-> На вкладке «Февраль» есть флажок «Разрешено».
Если установлен флажок «Разрешено», я хочу разрешить пользователю переходить из текущей панели.Если это не так, то они не могут уйти, пока это не так.
Я не могу найти способ обработать запрос на выход ДО того, как будет показан следующий Компонент (который может быть на другом JTabbedPane).
Это можно продемонстрировать, перейдя на вкладку Месяцы-> Февраль и затем выбрав вкладку Цвета.
Есть идеи?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
public class VerifyBeforeLeavingTab extends JFrame
{
private static final long serialVersionUID = 1L;
public VerifyBeforeLeavingTab()
{
setSize(700, 700);
JTabbedPane mainTabbedPane = new JTabbedPane(JTabbedPane.TOP);
MyJTabbedPane colorsPane = new MyJTabbedPane(JTabbedPane.TOP, "colors");
JPanel bluePanel = new JPanel();
bluePanel.setBackground(Color.blue);
colorsPane.addTab("Blue", bluePanel);
JPanel redPanel = new JPanel();
redPanel.setBackground(Color.red);
colorsPane.addTab("Red", redPanel);
mainTabbedPane.addTab("Colors", colorsPane);
JTabbedPane monthsPane = new MyJTabbedPane(JTabbedPane.TOP, "months");
JPanel janPanel = new JPanel();
monthsPane.addTab("January", janPanel);
JPanel febPanel = new MyUnleavableJPanel();
monthsPane.addTab("February", febPanel);
mainTabbedPane.addTab("Months", monthsPane);
add(mainTabbedPane, BorderLayout.CENTER);
getContentPane().add(mainTabbedPane);
}
private class MyUnleavableJPanel extends JPanel
{
private static final long serialVersionUID = 1L;
public MyUnleavableJPanel()
{
final JCheckBox chckBoxAllowToLeave = new JCheckBox("Allow to leave");
chckBoxAllowToLeave.setBounds(100, 100, 50, 50);
this.add(chckBoxAllowToLeave);
addHierarchyListener(new HierarchyListener()
{
public void hierarchyChanged(HierarchyEvent e)
{
if ((HierarchyEvent.SHOWING_CHANGED & e.getChangeFlags()) != 0)
{
if (isShowing())
{
System.out.println("Showing an unleavable panel");
}
else
{
// TODO: Do not let them leave this JCheckbox is selected
if (chckBoxAllowToLeave.isSelected())
{
System.out.println("OK to leave");
}
else
{
System.out.println("Not allowed to leave");
}
}
}
}
});
}
}
private class MyJTabbedPane extends JTabbedPane
{
private static final long serialVersionUID = 1L;
public MyJTabbedPane(int i, String name)
{
super(i);
setName(name);
}
@Override
public void setSelectedIndex(int index)
{
System.out.println("Now on '" + getName() + "' tab #" + index);
super.setSelectedIndex(index);
}
}
private static void createAndShowGUI()
{
// Create and set up the window.
VerifyBeforeLeavingTab frame = new VerifyBeforeLeavingTab();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
createAndShowGUI();
}
catch (Exception e)
{
e.printStackTrace();
System.exit(0);
}
}
});
}
}