2011-08-28 13 views
7

Tenía un método realmente extraño que se usa para ocultar la barra de título de JInternalFrame. Ahora el dilema está por debajo del método funciona en la plataforma de Windows,El método Java funciona en Windows pero no en Macintosh?

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

¡Pero no en Macintosh! Cualquier experto tiene alguna idea que pueda explicar el proceso interno que hace que este método no se pueda usar en Mac.

¿Y hay algún método que pueda funcionar en ambas plataformas para ocultar la barra de título de JInternalFrame?

Gracias

Respuesta

4

En Mac OS X, una instancia de com.apple.laf.AquaInternalFrameUI define la apariencia de los marcos internos. Puede minimizar la disparidad configurando la propiedad isPalette y deshabilitando los iconos de marco en Mac OS X específicamente, como se muestra a continuación.

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

Esto puede ser un rincón peludo de Swing. Esta funcionalidad no se agregó a swing hasta java 1.5 por lo que recuerdo.

¿Has probado el método Frame.setUndecorated?

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

Si eso no funciona, puede que tenga que bajar y hacer algo de JNI en el objeto ventana nativa subyacente. Tuve que hacer esto para una funcionalidad similar en Windows con el 1.4 jvm.

+0

[ 'JInternalFrame'] (http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html) es un componente de peso ligero; la apariencia es proporcionada por el delegado UI, 'InternalFrameUI'. – trashgod

Cuestiones relacionadas