i have four internal frames and 3 buttons in it .When i hit the maximize button,maximizes but it overlaps all the frames.But my point is that it should show the minimized frames. please find the code below
package Project;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;
public class Test {
public Test() throws HeadlessException, PropertyVetoException {
createAndShowGUI();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new Test();
} catch (HeadlessException ex) {
//Logger.getLogger(MinPanel1.class.getName()).log(Level.SEVERE, null, ex);
} catch (PropertyVetoException ex) {
// Logger.getLogger(MinPanel1.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
private void createAndShowGUI() throws HeadlessException, PropertyVetoException {
JFrame frame = new JFrame();
frame.setResizable(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final JDesktopPane jdp = new JDesktopPane() {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
};
frame.setContentPane(jdp);
frame.pack();
createAndAddInternalFrame(jdp, 0, 0);
createAndAddInternalFrame(jdp, 200, 0);
createAndAddInternalFrame(jdp, 400, 0);
createAndAddInternalFrame(jdp, 600, 0);
frame.setVisible(true);
}
private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException {
final JInternalFrame jInternalFrame = new JInternalFrame("Test1", true, true, true, true);
jInternalFrame.setLocation(x, y);
final JInternalFrame jInternalFrame1 = new JInternalFrame("Test2", true, true, true, true);
JPanel jp= new JPanel();
JButton jb1 = new JButton("min");
JButton jb2 = new JButton("[]");
JButton jb3 = new JButton("X");
jInternalFrame.setLayout(new GridLayout(2, 2,2,2));
jInternalFrame1.add(jb1);
jInternalFrame.setSize(200, 200);//testing
jInternalFrame.setLayout(new GridLayout(2,2));
JButton jb= new JButton("min");
// jInternalFrame.add(jb);
// jInternalFrame.add(jb3);
//jInternalFrame.add(jb2);
jp.add(jb);
jp.add(jb2);
jp.add(jb3);
jInternalFrame.add(jp);
jb.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
try {
jInternalFrame.setIcon(true);
} catch (PropertyVetoException ex) {
}
}
});
jb1.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
try {
jInternalFrame.setIcon(true);
} catch (PropertyVetoException ex) {
}
}
});
jb2.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
try {
jInternalFrame.setMaximum(true);
}
catch(Exception e)
{
}
}
});jb3.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
try {
jInternalFrame.dispose();
} catch (Exception ex) {
}
}
});
BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
jInternalFrame.remove(titlePane);
jInternalFrame.setVisible(true);
jInternalFrame1.setVisible(true);
jdp.add(jInternalFrame);
//jdp.add(jInternalFrame1);
}
}
You could try:
JDesktopPane#setComponentZOrder(Component com, int i)
. As per docs:This will allow you to set the order of the
JInternalFrame
s contained withinJDesktopPane
.UPDATE:
As per my comment:
Solution:
I suggest adjusting the layer on which maximized
JInternalFrame
is shown:We must also not forget to add it back to the
DEFAULT_LAYER
when it is minimized:Here is full code:
Here's the result of calling
moveToBack()
in the maximize button handler. Also remember to callpack()
on the internal frame.Addendum: I've updated the example to include max, min and icon buttons. The buttons use
Action
for easier testing, and the internal frames have distinct names. SeecreateToolBar()
to change the L&F dynamically, e.g.