0

のタイトルバーの高さを調べるにはどうすればよいJInternalFrameですか? OS と L&F に依存しない方法でこれを行うことが望ましいでしょう。

このSO questionを見たことがありますが、これは同様の質問をしているようですが、JDialog. ただし、答えはContainerメソッドの使用を示唆しているようgetInsets()で、javadocには次のように記載されています。

コンテナーの境界線のサイズを示す、このコンテナーのインセットを決定します。

たとえば、Frame オブジェクトには、フレームのタイトル バーの高さに対応する上部インセットがあります。

残念ながら、ではJInternalFrameなくです。そのため、これは境界線のサイズのみを提供します。FrameJComponent

前の SO の質問で、ユースケースは何かと尋ねられたので、私の説明をさせてください。JInternalFrame親フレーム内のマウスクリックの右下に現在表示されているスペースよりも大きくないことを含め、マウスクリックの時点でポップアップし、いくつかの最大/最小基準に合わせてサイズを変更したいです。

次の SSCCE を検討してください。

/**
 * @author amaidment
 */
public class JInternalFrameToy {

  public static void main(String[] args) {
    // create top-level frame
    final JFrame frame = new JFrame("JInternalFrame Toy");
    frame.setPreferredSize(new Dimension(500, 500));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // create desktop pane
    final JDesktopPane pane = new JDesktopPane();

    // put button on the base of the desktop pane
    JButton button = new JButton("Create Internal Frame");
    button.setSize(new Dimension(100,100));
    button.setVisible(true);
    button.setLocation(0, 0);
    button.setSelected(true);
    pane.add(button);
    frame.setContentPane(pane);

    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // create internal frame
        JInternalFrame internal = new JInternalFrame("Internal Frame", 
          true, true, false, false);
        JLabel label = new JLabel("Hello world!");

        // set size of internal frame
        Dimension parentSize = pane.getParent().getSize();
        Insets insets = internal.getInsets();
        Point point = pane.getMousePosition();
        int width = parentSize.width - (insets.left+insets.right) - point.x;
        int height = parentSize.height - (insets.top+insets.bottom) -  point.y;
        label.setPreferredSize(new Dimension(width, height));

        internal.setContentPane(label);
        internal.setLocation(point);
        internal.pack();
        internal.setVisible(true);
        pane.add(internal);
        internal.toFront();
      }
    });

    frame.pack();
    frame.setVisible(true);
  }
}

これを実行するとわかるように、内部ポップアップは高さではなく幅に合わせてサイズ変更されます。つまり、高さがフレーム サイズよりも...JInternalFrameのタイトル バーの高さを超えています。JInternalFrameそのため、この高さを調べて、のサイズを適切に設定できるようにしたいと考えています。

4

3 に答える 3

1

私が今までに思いついた最高のもの...

Dimension parentSize = pane.getParent().getSize();
// get the initial preferred size - this has to be done before setContentPane()
// the height should, I think, be the border + height of the title bar
// the width is based on the title name, icon, etc. so is not useful
Dimension initSize = internal.getPreferredSize(); 

// then get the insets, which can be used for the horizontal border
Insets insets = internal.getInsets();

Point point = pane.getMousePosition();
int width = parentSize.width - (insets.left+insets.right) - point.x;
int height = parentSize.height - initSize.height -  point.y;
label.setPreferredSize(new Dimension(width, height));

これがこれを行うための最良の方法であるかどうかわからないので、代替の回答や提案された改善を歓迎します...

于 2012-10-09T16:40:53.390 に答える
1

次のようなものを試すことができます

( (javax.swing.plaf.basic.BasicInternalFrameUI) getUI()).getNorthPane().getPreferredSize();
于 2012-10-09T19:18:42.527 に答える
-1

その特定の JComponent の getHeight() を呼び出すことができますか? ドキュメントを見る

于 2012-10-09T16:31:29.287 に答える