2011-08-28 35 views
7

Avevo un metodo strano che viene utilizzato per nascondere la barra del titolo di JInternalFrame. Ora il dilemma è sotto il metodo funziona su piattaforma Windows,Il metodo Java funziona su Windows ma non su Macintosh?

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

Ma non su Macintosh! Qualsiasi esperto ha qualche idea che possa spiegare il processo interno che rende questo metodo non utilizzabile su Mac.

E c'è qualche metodo che può funzionare su entrambe le piattaforme per nascondere la barra del titolo di JInternalFrame?

Grazie

risposta

4

Su Mac OS X, un'istanza di com.apple.laf.AquaInternalFrameUI definisce l'aspetto dei fotogrammi interni. È possibile ridurre al minimo la disparità impostando la proprietà isPalette e disattivando le icone del frame su Mac OS X in modo specifico, come mostrato di seguito.

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

Questo potrebbe essere un angolo peloso di Swing. Questa funzionalità non è stata aggiunta a swing fino a java 1.5 per quanto ricordo.

hai provato il metodo Frame.setUndecorated?

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

Se questo non dovesse funzionare, potrebbe essere necessario discesa e fare un po JNI sull'oggetto native window sottostante. Ho dovuto fare questo per funzionalità simili su Windows con la jvm 1.4.

+0

[ 'JInternalFrame'] (http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html) è un componente leggero; l'aspetto è fornito dal delegato dell'interfaccia utente, 'InternalFrameUI'. – trashgod

Problemi correlati