2011-08-28 15 views
7

私はJInternalFrameのタイトルバーを隠すために使用される本当の変わった方法を持っていました。今、ジレンマはWindowsプラットフォーム上のメソッドの下にあります。JavaメソッドはWindowsでは動作しますがMacintoshでは動作しませんか?

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

Macintoshではありません!どのような専門家も、このプロセスをMac上では使用できないようにする内部プロセスを説明できるアイデアを持っています。

プラットフォームとタイトルバーを非表示にする方法はありますかJInternalFrame

おかげ

答えて

4

Mac OS Xでは、com.apple.laf.AquaInternalFrameUIのインスタンスが内部フレームの外観を定義します。 isPaletteプロパティを設定し、Mac OS Xのフレームアイコンを無効にすることで、以下のように視差を最小限に抑えることができます。

enter image description here

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(); 
      } 
     }); 
    } 
} 
1

これは、Swingの毛深いコーナーもあります。この機能は、私が思い出す限り、Java 1.5までスイングに追加されていません。

Frame.setUndecoratedメソッドを試しましたか?

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

問題が解決しない場合は、ドロップダウン、基礎となるネイティブウィンドウオブジェクトにいくつかのJNIを行う必要があります。私は、1.4のjvmを使ってWindows上で同様の機能を実行する必要がありました。

+0

[ 'JInternalFrame'(http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html)が軽量コンポーネントです。外観はUIデリゲート、InternalFrameUIによって提供されます。 – trashgod

関連する問題