6

重複の可能性:
JDialog では、ユーザーはダイアログの幅のみを変更できます

幅をサイズ変更可能にしたい JDialog がありますが、高さは変更できません。

これは私の現在のコードです:

addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        setLocation(getLocation().x, getLocation().y + (getHeight() - staticHeight));
        setSize(new Dimension(getWidth(), staticHeight));
        super.componentResized(e);
    }
});

問題は、ウィンドウのサイズが変更された後にそのコードが呼び出されることです。ウィンドウのサイズを変更してからちらつく。

ユーザーがウィンドウの高さをドラッグしようとしても何もしないようにしたいと思います。

4

4 に答える 4

4
  • サイズ変更を直接停止することはできません。

  • コンテナーの基本的なプロパティをブロックすることはできません。

  • コンテナーはネイティブ OS から作成され、そのプロパティに基づいて構築されているため、

  • サイズ変更の制限は画面サイズです

  • 残りは(コード付き)@camickrによるコンポーネントのサイズ変更

  • AbsoluteLayout に基づく汚いハックがあり、それを使用することはお勧めしません

  • サイズ変更中にちらつきやフリーズがある場合は、サイズ変更をブロックします

于 2012-05-08T16:13:31.727 に答える
3

しばらく探した後、本当に満足のいく解決策を見つけることができませんでした。ダイアログのサイズ変更はOSレベルで直接処理されるものだと思います。したがって、完全にサイズ変更できない、または完全にサイズ変更できないようにする必要があるとしか言えません。

以下のコードは、ダイアログが大きくなるのを常に防ぎますが、ユーザーがダイアログのサイズを変更しても、ダイアログの境界線は移動します。

同じくradaiによって提案された他のオプションは、サイズ変更を防ぎ、マウスをリッスンしてそれに応じてサイズ変更するマウスリスナーでカスタムコンテンツペインを設定することです。ただし、これはユーザーにとってあまりネイティブではないと思います(ダイアログの境界でイベントをキャッチできるとは思いません)。

import java.awt.Frame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;

public class Test {

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

    public static void init() {
        final int staticHeight = 150;
        final JDialog dialog = new JDialog((Frame) null) {

            @Override
            protected JRootPane createRootPane() {
                JRootPane rp = new JRootPane() {
                    @Override
                    public void reshape(int x, int y, int w, int h) {
                        super.reshape(x, y, w, staticHeight);
                    }
                };
                rp.setOpaque(true);
                return rp;
            }

            @Override
            public void reshape(int x, int y, int width, int height) {
                super.reshape(x, y, width, staticHeight);
            }

        };
        dialog.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                dialog.setSize(dialog.getWidth(), staticHeight);
            }
        });
        dialog.pack();
        dialog.setVisible(true);

    }
}
于 2012-05-08T15:58:56.617 に答える
3

できないようです。setResizable() メソッドがありますが、その全か無かです。
JDialog内のレイアウトを使用してこれを軽減して、JDialogの高さに関係なくコンテンツが同じ高さのままになるようにする
か、おそらく(もう少し過激な)サイズ変更不可として設定し、サイズを変更するための独自のマウスリスナーを実装できますか?そうすれば、完全に制御できます

于 2012-05-08T15:37:11.783 に答える
1

ここで、このコード例を試してくださいJDialog。垂直方向のサイズ変更を行わないように設定する方法です。私は本当にこれの功績を認めたくありませんが、このプログラムの作成者である "Darryl Burke" の全功績は、このプログラムへのリンクです

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  

public class WidthResizeableDialog {  

  Robot robot;  
  static final int HEIGHT = 400;  
  Point lastLocation;  

  public static void main(String[] args) {  
    SwingUtilities.invokeLater(new Runnable() {  

      @Override  
      public void run() {  
        new WidthResizeableDialog().makeUI();  
      }  
    });  
  }  

  public void makeUI() {  
    try {  
      robot = new Robot();  
    } catch (AWTException ex) {  
      ex.printStackTrace();  
    }  
    final JDialog dialog = new JDialog();  
    dialog.setSize(400, HEIGHT);  
    dialog.setLocationRelativeTo(null);  
    dialog.addWindowListener(new WindowAdapter() {  

      @Override  
      public void windowClosing(WindowEvent e) {  
        System.exit(0);  
      }  
    });  
    dialog.addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentMoved(ComponentEvent e) {  
        SwingUtilities.invokeLater(new Runnable() {  

          @Override  
          public void run() {  
            lastLocation = dialog.getLocation();  
          }  
        });  
      }  
    });  
    dialog.getRootPane().addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentResized(ComponentEvent e) {  
        int height = dialog.getHeight();  
        if (robot != null && height != HEIGHT) {  
          robot.mouseRelease(InputEvent.BUTTON1_MASK);  
          dialog.setLocation(lastLocation);  
          dialog.setSize(dialog.getWidth(), HEIGHT);  
        }  
      }  
    });  
    dialog.setVisible(true);  
  }  
} 
于 2012-05-08T16:46:50.563 に答える