3

私はプロジェクトに取り組んでいます。メインフレームには JInternalFrames があります。ここで、それらを JFrame にする必要があります。JFrame を使用して JInternalFrame を保持することを検討しています。問題は、Internalframe のタイトルバーがそこにあり、ユーザーがそれをドラッグできることです。

内部フレームを JFrame のペインのように機能させる方法はありますか? インターネットで検索したところ、誰かがタイトルペインを削除していることがわかりました。

これについて何か良い考えはありますか?

ありがとうございます!

更新: 多分私は間違った道を進んでいた. 本当の問題は、JInternal フレームがメイン フレームから抜け出せないことです。または、フレームの外側にあるように見せる方法はありますか?

4

2 に答える 2

4

内部フレームを JFrame のペインのように機能させる方法はありますか

paneの意味がよくわかりませんが、JPanel? もちろんできますが、なんらかのクイックフローティング パネルが必要な場合を除き、なぜ私の質問になりますが、ドラッグ可能にしたくないと言うよりも? だから私はあなたの動機に少し確信が持てず、答えるのにうんざりしています....

問題は、Internalframe のタイトルバーがあることです

さて、タイトルペインを削除するコードは次のとおりです(ここで見つかりました):

//remove title pane http://www.coderanch.com/t/505683/GUI/java/JInternalframe-decoration
BasicInternalFrameTitlePane titlePane =(BasicInternalFrameTitlePane)((BasicInternalFrameUI)jInternalFrame.getUI()).getNorthPane();
jInternalFrame.remove(titlePane);

ユーザーはそれをドラッグできます。

そして、これを移動可能にするsをJInternalFrame削除することで移動不能にすることわかりましたがMouseListener、 を削除する必要はないことに注意することが重要です。自分で削除するには:MouseListenerNorthPaneMouseListener

//remove the listeners from UI which make the frame move
BasicInternalFrameUI basicInternalFrameUI = ((javax.swing.plaf.basic.BasicInternalFrameUI) jInternalFrame.getUI());
for (MouseListener listener : basicInternalFrameUI.getNorthPane().getMouseListeners()) {
    basicInternalFrameUI.getNorthPane().removeMouseListener(listener);
}

そして、あなたのタイトルの通り:

JInternalFrameコンテナを埋める方法

sと(はオーバーライドによってサイズが変更されます) のパラメーターを使用してsetSize(int width,int height)呼び出すだけです。JInternalFrameJDesktopPanewidthheightJDesktopPanegetPreferredSize()

これにより、次のようになります。

ここに画像の説明を入力

import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.MouseListener;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;

/**
 *
 * @author David
 */
public class Test {

    public Test() {
        createAndShowGUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();

            }
        });
    }

    private void createAndShowGUI() throws HeadlessException {
        JFrame frame = new JFrame();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JDesktopPane jdp = new JDesktopPane() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        frame.setContentPane(jdp);
        frame.pack();

        createAndAddInternalFrame(jdp);

        frame.setVisible(true);
    }

    private void createAndAddInternalFrame(final JDesktopPane jdp) {
        JInternalFrame jInternalFrame = new JInternalFrame("Test", false, false, false, false);
        jInternalFrame.setLocation(0, 0);
        jInternalFrame.setSize(jdp.getWidth(), jdp.getHeight());

        //remove title pane http://www.coderanch.com/t/505683/GUI/java/JInternalframe-decoration
        BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
        jInternalFrame.remove(titlePane);

        /*
         //remove the listeners from UI which make the frame move
         BasicInternalFrameUI basicInternalFrameUI = ((javax.swing.plaf.basic.BasicInternalFrameUI) jInternalFrame.getUI());
         for (MouseListener listener : basicInternalFrameUI.getNorthPane().getMouseListeners()) {
         basicInternalFrameUI.getNorthPane().removeMouseListener(listener);
         }
         */
        jInternalFrame.setVisible(true);

        jdp.add(jInternalFrame);
    }
}
于 2013-01-30T11:50:14.437 に答える
2

要件を考慮して、コンテンツ ペインJPanel内で単純な を使用することをお勧めします。JFrame

于 2013-01-30T09:16:57.530 に答える