Java方法适用于Windows而不适用于Macintosh?

我有一个真正奇怪的方法,用于隐藏JInternalFrame的标题栏。 现在的困境是在windows平台上的方法工作,

 ((javax.swing.plaf.basic.BasicInternalFrameUI) aXInternalFrame.getUI()).setNorthPane(null); 

但不是在Macintosh上! 任何专家都有任何想法可以解释内部过程使得这种方法在Mac上无法使用。

是否有任何方法可以在两个平台上隐藏JInternalFrame标题栏?

谢谢

在Mac OS X上, 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 http://stackoverflow.com/questions/7218971 */ 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才提供此function。

你试过Frame.setUndecorated方法吗?

http://download.oracle.com/javase/1.5.0/docs/api/java/awt/Frame.html#setUndecorated%28boolean%29

如果这不起作用,您可能需要下拉并在底层本机窗口对象上执行一些JNI。 我必须在1.4 jvm的Windows上执行此类function。