我有四个内部帧,并在其中3个按钮。当我打的最大化按钮,最大化但重叠的所有frames.But我的观点是,它应该显示最小化的框架。 请看下面的代码
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);
}
}
你可以尝试: JDesktopPane#setComponentZOrder(Component com, int i)
。 按照文档 :
将指定组件移动到所述容器中的指定的z顺序索引。 z顺序确定部件被绘的顺序; 最高z顺序的组件首先涂料和具有最低z顺序的组件最后绘制。 其中组分重叠,与所述较低的z顺序组件绘制在具有较高z顺序的组件。
...
注意:
并非所有的平台都支持从一个容器改变重量级组件的z顺序到另一个,而不调用的removeNotify。 有没有办法来检测平台是否支持这一点,因此开发人员不应该做任何假设。
这将允许您设置的顺序JInternalFrame
包含在小号JDesktopPane
。
更新:
按我的评论:
从我可以看到它的默认行为,似乎没有超过COM-能够通过JDesktopPane#setComponentZOrder(Component com, int i)
当JInternalFrame
图标化 。 它正常工作时,其处于正常状态
解:
我建议调整其上最大化层JInternalFrame
所示:
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
if (jInternalFrame.isMaximum()) {//restore
jInternalFrame.pack();
} else {//maximize
jInternalFrame.setMaximum(true);
}
jdp.remove(jInternalFrame);
jdp.add(jInternalFrame, JDesktopPane.FRAME_CONTENT_LAYER);
jdp.revalidate();
jdp.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
});
我们也不能忘记将它添加回DEFAULT_LAYER
当它被最小化:
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
if (jInternalFrame.getLayer() == JDesktopPane.FRAME_CONTENT_LAYER) {
jdp.remove(jInternalFrame);
jdp.add(jInternalFrame, JDesktopPane.DEFAULT_LAYER);
jdp.revalidate();
jdp.repaint();
}
jInternalFrame.pack();
jInternalFrame.setIcon(true);
} catch (PropertyVetoException ex) {
}
}
});
下面是完整的代码:
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) {
ex.printStackTrace();
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
}
});
}
private void createAndShowGUI() throws HeadlessException, PropertyVetoException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final JDesktopPane jdp = new JDesktopPane() {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
};
frame.setContentPane(jdp);
frame.pack();
createAndAddInternalFrame(jdp, 0, 0);
createAndAddInternalFrame(jdp, 300, 0);
createAndAddInternalFrame(jdp, 0, 200);
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);
JPanel jp = new JPanel();
JButton jb = new JButton("min");
JButton jb2 = new JButton("max/restore");
JButton jb3 = new JButton("close");
jInternalFrame.setLayout(new GridLayout(2, 2));
jp.add(jb);
jp.add(jb2);
jp.add(jb3);
jInternalFrame.add(jp);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
if (jInternalFrame.getLayer() == JDesktopPane.FRAME_CONTENT_LAYER) {
jdp.remove(jInternalFrame);
jdp.add(jInternalFrame, JDesktopPane.DEFAULT_LAYER);
jdp.revalidate();
jdp.repaint();
}
jInternalFrame.pack();
jInternalFrame.setIcon(true);
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
if (jInternalFrame.isMaximum()) {//restore
jInternalFrame.pack();
} else {//maximize
jInternalFrame.setMaximum(true);
}
jdp.remove(jInternalFrame);
jdp.add(jInternalFrame, JDesktopPane.FRAME_CONTENT_LAYER);
jdp.revalidate();
jdp.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
});
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
jInternalFrame.dispose();
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
jInternalFrame.remove(titlePane);
jInternalFrame.pack();
jInternalFrame.setVisible(true);
jdp.add(jInternalFrame);
}
}
下面是调用的结果moveToBack()
的最大化按钮的处理程序。 还记得打电话pack()
的内部框架上。
附录:我已经更新的例子,包括最大 , 最小和图标按钮。 按钮使用Action
更容易测试和内部框架具有不同的名称。 看看createToolBar()
来动态地改变L&F,例如
frame.add(createToolBar(frame), BorderLayout.NORTH);
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyVetoException;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
//* @see https://stackoverflow.com/a/14874924/230513 */
public class Test {
public Test() {
createAndShowGUI();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JDesktopPane jdp = new JDesktopPane() {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
};
for (int i = 0; i < 4; i++) {
createInternalFrame(jdp, 100 * i, 100 * i);
}
frame.add(jdp);
frame.pack();
frame.setVisible(true);
}
private void createInternalFrame(final JDesktopPane jdp, int x, int y) {
final JInternalFrame jif = new JInternalFrame("Test" + x, true, true, true, true);
jif.setLocation(x, y);
JPanel jp = new JPanel();
jp.add(new JButton(new AbstractAction("max") {
@Override
public void actionPerformed(ActionEvent ae) {
try {
jif.setMaximum(true);
jif.moveToBack();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
}));
jp.add(new JButton(new AbstractAction("min") {
@Override
public void actionPerformed(ActionEvent ae) {
try {
jif.setMaximum(false);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
}));
jp.add(new JButton(new AbstractAction("icon") {
@Override
public void actionPerformed(ActionEvent ae) {
try {
jif.setIcon(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
}));
jif.add(jp);
jif.pack();
jif.setVisible(true);
jdp.add(jif);
}
}