7

JInternalFrameのタイトルバーを非表示にするために使用される本当に奇妙な方法がありました。現在、ジレンマは以下の方法で、Windows プラットフォームで動作します。

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

しかし、マッキントッシュではありません!専門家なら誰でも、この方法を Mac で使用できないようにする内部プロセスを説明できる考えを持っています。

また、両方のプラットフォームでタイトルバーを非表示にする方法はありますJInternalFrameか?

ありがとう

4

2 に答える 2

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();
            }
        });
    }
}
于 2011-08-28T11:04:17.687 に答える
1

これは、Swing の毛むくじゃらのコーナーかもしれません。この機能は、私が思い出す限り、Java 1.5 までスイングに追加されませんでした。

Frame.setUndecorated メソッドを試しましたか?

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

それがうまくいかない場合は、ドロップダウンして、基礎となるネイティブ ウィンドウ オブジェクトで JNI を実行する必要がある場合があります。1.4 jvm を使用する Windows で同様の機能を実現するには、これを行う必要がありました。

于 2011-08-28T05:47:24.163 に答える