2011-08-28 41 views
7

Tôi đã có một phương pháp kỳ lạ thực sự được sử dụng để ẩn thanh tiêu đề của JInternalFrame. Bây giờ tiến thoái lưỡng nan là dưới đây phương pháp hoạt động trên nền tảng cửa sổ,Phương pháp Java hoạt động trên các cửa sổ nhưng không hoạt động trên Macintosh?

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

Nhưng không phải trên Macintosh! Bất kỳ chuyên gia có bất kỳ ý tưởng nào có thể giải thích quá trình nội bộ mà làm cho phương pháp này không thể sử dụng trên máy Mac.

Và có phương pháp nào có thể hoạt động trên cả hai nền tảng để ẩn thanh tiêu đề của JInternalFrame không?

Cảm ơn

Trả lời

4

Trên Mac OS X, phiên bản com.apple.laf.AquaInternalFrameUI xác định giao diện của khung nội bộ. Bạn có thể giảm thiểu chênh lệch bằng cách đặt thuộc tính isPalette và vô hiệu hóa các biểu tượng khung trên Mac OS X cụ thể, như được hiển thị bên dưới.

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

Đây có thể là góc lông của Swing. Chức năng này đã không được thêm vào swing cho đến khi java 1,5 như xa như tôi nhớ lại.

bạn đã thử phương thức Frame.setUndecorated chưa?

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

Nếu điều đó không làm việc, bạn có thể cần phải thả xuống và làm một số JNI trên đối tượng cửa sổ có nguồn gốc cơ bản. Tôi đã phải làm điều này cho chức năng tương tự trên các cửa sổ với 1,4 jvm.

+0

[ 'JInternalFrame'] (http://download.oracle.com/javase/6/docs/api/javax/swing/JInternalFrame.html) là một thành phần trọng lượng nhẹ; giao diện người dùng được cung cấp bởi 'InternalFrameUI'. – trashgod

Các vấn đề liên quan