我以前有一个奇怪的方法,可以隐藏JInternalFrame
标题栏。现在问题是,这种方法只适用于Windows平台。
((javax.swing.plaf.basic.BasicInternalFrameUI) aXInternalFrame.getUI()).setNorthPane(null);
但在Macintosh上不适用!有没有专家知道是什么内部过程导致这种方法在Mac上不能使用。
是否有一种可以在两个平台上隐藏JInternalFrame
标题栏的方法?
谢谢
我以前有一个奇怪的方法,可以隐藏JInternalFrame
标题栏。现在问题是,这种方法只适用于Windows平台。
((javax.swing.plaf.basic.BasicInternalFrameUI) aXInternalFrame.getUI()).setNorthPane(null);
但在Macintosh上不适用!有没有专家知道是什么内部过程导致这种方法在Mac上不能使用。
是否有一种可以在两个平台上隐藏JInternalFrame
标题栏的方法?
谢谢
com.apple.laf.AquaInternalFrameUI
的一个实例定义了内部框架的外观。您可以通过设置isPalette
属性并在特定于Mac OS X的情况下禁用框架图标来最小化差异,如下所示。import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicInternalFrameUI;
/** @see https://dev59.com/V1rUa4cB1Zd3GeqPmbWg */
public class InternalFrame {
private static final int DELTA = 40;
private JDesktopPane desktop = new JDesktopPane();
private int offset = DELTA;
public InternalFrame() {
JFrame f = new JFrame("Add Frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setPreferredSize(new Dimension(400, 400));
JPanel p = new JPanel();
p.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
createInternalFrame();
}
}));
f.add(p, BorderLayout.SOUTH);
createInternalFrame();
f.add(desktop, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private void createInternalFrame() {
JInternalFrame internalFrame = new JInternalFrame(
"Internal Frame");//, true, true, true, true);
desktop.add(internalFrame);
internalFrame.setLocation(offset, offset);
offset += DELTA;
if (System.getProperty("os.name").startsWith("Mac OS")) {
internalFrame.putClientProperty("JInternalFrame.isPalette", true);
} else {
((BasicInternalFrameUI) internalFrame.getUI()).setNorthPane(null);
}
internalFrame.add(createTabbedPane());
internalFrame.pack();
internalFrame.setVisible(true);
}
// take up some space
private JTabbedPane createTabbedPane() {
JTabbedPane jtp = new JTabbedPane();
createTab(jtp, "One");
createTab(jtp, "Two");
return jtp;
}
private void createTab(JTabbedPane jtp, String s) {
jtp.add(s, new JLabel("TabbedPane " + s, JLabel.CENTER));
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
InternalFrame myInternalFrame = new InternalFrame();
}
});
}
}
这可能是Swing的一个棘手问题。据我回忆,这个功能直到Java 1.5才被添加到Swing中。
你尝试过Frame.setUndecorated方法吗?
http://download.oracle.com/javase/1.5.0/docs/api/java/awt/Frame.html#setUndecorated%28boolean%29
如果那不起作用,您可能需要降低并在底层本地窗口对象上执行一些 JNI 操作。我曾经在 Windows 平台的 1.4 jvm 上为类似的功能这样做过。
JInternalFrame
是一个轻量级组件;外观由UI代理InternalFrameUI
提供。 - trashgod