2011-08-28 19 views
7

मेरे पास एक असली अजीब विधि थी जिसका उपयोग JInternalFrame के शीर्षक पट्टी को छिपाने के लिए किया जाता है। अब दुविधा विंडोज प्लेटफ़ॉर्म पर विधि कार्य से नीचे है,जावा विधि विंडोज़ पर काम करती है लेकिन मैकिनटोश नहीं?

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

लेकिन मैकिनटोश पर नहीं! किसी भी विशेषज्ञ के पास कोई विचार है जो आंतरिक प्रक्रिया को समझा सकता है जो इस विधि को मैक पर उपयोग करने योग्य नहीं बनाता है।

और क्या कोई तरीका है जो JInternalFrame के टाइटलबार को छिपाने के लिए दोनों प्लेटफॉर्म पर काम कर सकता है?

धन्यवाद

उत्तर

4

मैक ओएस एक्स पर, com.apple.laf.AquaInternalFrameUI का एक उदाहरण आंतरिक फ्रेम की उपस्थिति को परिभाषित करता है। आप नीचे दिखाए गए अनुसार, isPalette संपत्ति को सेट करके और मैक ओएस एक्स पर फ्रेम आइकन अक्षम करके असमानता को कम कर सकते हैं।

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

यह स्विंग का बालों का कोना हो सकता है। जब तक मुझे याद नहीं है तब तक यह कार्यक्षमता जावा 1.5 तक स्विंग में नहीं जोड़ा गया था।

क्या आपने Frame.setUndecorated विधि की कोशिश की है?

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

हैं कि आप अंतर्निहित देशी विंडो ऑब्जेक्ट पर कुछ JNI ड्रॉप डाउन और क्या करने की जरूरत हो सकती है काम नहीं करता। मुझे 1.4 जेवीएम के साथ विंडोज़ पर समान कार्यक्षमता के लिए ऐसा करना पड़ा।

+0

[ 'JInternalFrame'] (http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html) एक हल्के घटक है; उपस्थिति यूआई प्रतिनिधि, 'InternalFrameUI' द्वारा प्रदान की जाती है। – trashgod

संबंधित मुद्दे