2011-08-28 4 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에서 프레임 아이콘을 특별히 비활성화하여 불일치를 최소화 할 수 있습니다.

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

이것은 스윙의 털이 많은 코너 일 수 있습니다. 이 기능은 자바 1.5까지 내가 스윙까지 추가되지 않았다.

Frame.setUndecorated 메소드를 사용해 보셨습니까?

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

그건 당신이 기본 window 객체에 대한 몇 가지 JNI를 드롭 다운 할 필요가 있습니다 작동하지 않는 경우. 1.4 jvm이있는 창에서 이와 비슷한 기능을 수행해야했습니다.

+0

enter image description here는 [ 'JInternalFrame'은 (http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html)는 경량의 성분이고; 외양은 UI 위임자 인 InternalFrameUI에 의해 제공됩니다. – trashgod

관련 문제