1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| package test.iframe;
import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.util.Arrays;
import java.util.Objects;
public final class Main {
static void main(final String... args) {
SwingUtilities.invokeLater(() -> Main.launch(args));
}
private static void launch(String... args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
final var bluePanel = new ColorPanel(Color.BLUE, "Blue");
final var greenPanel = new ColorPanel(Color.GREEN, "Green");
final var redPanel = new ColorPanel(Color.RED, "Red");
final var frame = new JFrame("Test");
frame.setSize(1024, 800);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
final var fileMenu = new JMenu("File");
final var menuBar = new JMenuBar();
menuBar.add(fileMenu);
final var button1 = new JButton("Button");
final var toolBar = new JToolBar();
toolBar.setFloatable(false);
toolBar.add(button1);
toolBar.add(Box.createHorizontalGlue());
final var desktop = new JDesktopPane();
final var iFrameManager = new IFrameManager(frame.getContentPane(), desktop, toolBar);
Arrays.stream(new ColorPanel[]{bluePanel, greenPanel, redPanel})
.forEach(panel -> {
final var title = "Test %s".formatted(panel.getName());
final var iFrame = new JInternalFrame(title, true, true, true, true);
iFrame.setLayout(new BorderLayout());
iFrame.getContentPane().add(panel, BorderLayout.CENTER);
iFrame.setSize(800, 600);
iFrame.putClientProperty("size", new Dimension(800, 600));
iFrame.setVisible(true);
iFrame.addPropertyChangeListener(iFrameManager);
desktop.add(iFrame);
});
frame.setJMenuBar(menuBar);
frame.add(toolBar, BorderLayout.NORTH);
frame.add(desktop, BorderLayout.CENTER);
frame.setVisible(true);
}
private static final class IFrameManager implements PropertyChangeListener {
private final Container parent;
private final JDesktopPane desktop;
private final JToolBar toolBar;
private JInternalFrame iFrame;
private Component content;
private JComponent controlBox;
public IFrameManager(final Container parent, final JDesktopPane desktop, final JToolBar toolBar) {
this.parent = parent;
this.desktop = desktop;
this.toolBar = toolBar;
}
private void restoreContentToDesktop() {
parent.remove(content);
iFrame.getContentPane().add(content, BorderLayout.CENTER);
parent.add(desktop, BorderLayout.CENTER);
}
private void postCleanup() {
if (Objects.nonNull(controlBox)) {
toolBar.remove(controlBox);
}
content = null;
iFrame = null;
}
private JComponent getControlBox() {
if (Objects.nonNull(controlBox)) {
return controlBox;
}
final var minimizeButton = new JButton("_");
minimizeButton.addActionListener(event -> {
restoreContentToDesktop();
try {
iFrame.setMaximum(false);
iFrame.setIcon(true);
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
postCleanup();
});
final var maximizeButton = new JButton("□");
maximizeButton.addActionListener(event -> {
restoreContentToDesktop();
try {
iFrame.setMaximum(false);
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
postCleanup();
});
final var closeButton = new JButton("×");
closeButton.addActionListener(event -> {
restoreContentToDesktop();
desktop.remove(iFrame);
iFrame.dispose();
postCleanup();
desktop.repaint();
});
final var panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(minimizeButton);
panel.add(maximizeButton);
panel.add(closeButton);
controlBox = panel;
return controlBox;
}
@Override
public void propertyChange(final PropertyChangeEvent event) {
final var source = (JInternalFrame) event.getSource();
switch (event.getPropertyName()) {
case JInternalFrame.IS_MAXIMUM_PROPERTY -> {
final boolean isMaximized = source.isMaximum();
if (isMaximized) {
iFrame = source;
parent.remove(desktop);
content = iFrame.getContentPane().getComponent(0);
iFrame.getContentPane().remove(content);
parent.add(content, BorderLayout.CENTER);
toolBar.add(getControlBox());
}
}
default -> {
}
}
}
}
private static final class ColorPanel extends JComponent {
private final Color color;
public ColorPanel(final Color color, final String name) {
super();
this.color = color;
setName(name);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
} |