我想要一些关于如何去装饰和装饰JInternalFrame的帮助。我的框架类是这样的:
package com;
import java.awt.BorderLayout;
import java.awt.Font;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicInternalFrameUI;
public class InternalFrame extends JInternalFrame
{
private static final long serialVersionUID = -1001515635581955601L;
private Border border;
private final JComponent northPane;
public InternalFrame(String name)
{
super(name, true, true, true, true);
border = getBorder();
northPane = ((BasicInternalFrameUI) getUI()).getNorthPane();
setName(name);
setSize(800, 600);
setLayout(new BorderLayout());
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setFont(new Font("Lucida Console", Font.PLAIN, 12));
}
public void setUndecorated(boolean val)
{
setBorder(val ? null : border);
((BasicInternalFrameUI) getUI()).setNorthPane(val ? null : northPane);
}
}
然后我用:
InternalFrame frame = new InternalFrame("My Internal Frame");
desktop.add(frame);
frame.setVisible(true);
frame.setUndecorated(true);
到目前为止一切都很好,JInternalFrame变得像我想的那样没有装饰。那么问题是我想用frame.setUndecorated(false);
再次装饰框架
Border
将被填充,但NorthPane
的{{1}}将不会。
有关如何解决该问题的任何建议吗?
答案 0 :(得分:1)
好的,我在这里找到了一个解决方案:https://community.oracle.com/thread/1493647。 所以在我的代码中我添加
public void setRootPaneCheckingEnabled(boolean enabled)
{
super.setRootPaneCheckingEnabled(enabled);
}
并将我的setUndecorated方法更改为:
public void setUndecorated(boolean val)
{
setBorder(val ? null : border);
setRootPaneCheckingEnabled(false);
((BasicInternalFrameUI) getUI()).setNorthPane(val ? null : northPane);
setRootPaneCheckingEnabled(true);
}
现在我的代码完美无缺。
答案 1 :(得分:0)
正如documentation所述:
框架可以使用setUndecorated关闭其原生装饰(即Frame和Titlebar)。这只能在框架不可显示时完成。
我猜你正试图改变它displayable:
当组件添加到可显示的包含层次结构或其包含层次结构可显示时,组件可显示。当包含层次结构打包或可见时,可以显示包含层次结构。
从可显示的包含层次结构中移除组件或使其包含层次结构不可显示时,组件将不可显示。当处置其祖先窗口时,包含层次结构将无法显示。