2012-05-08 26 views
5

可能性の重複:
JDialog allow user to only change width of the dialogJDialogの固定の高さ

私は幅がサイズ変更可能になりたいの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); 
    } 
}); 

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

ユーザーがウィンドウの高さをドラッグしようとすると、何もしません。

+0

+1は、あなたは私が –

答えて

3

あなたが傾けるように見えます。 setResizable()メソッドがありますが、その全体または一部はありません。
JDialog内のレイアウトを使用してJDialogの高さが
になってもコンテンツが同じ高さになるように調整したり、サイズ変更できないように設定したり、サイズ変更用に独自のマウスリスナーを実装するあなた自身?そういう形であなたは完全にコントロールすることができます

3

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

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

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

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); 

    } 
} 

  • コンテナbecaseネイティブOSからあなたは、容器の基本的な性質をブロックすることはできません

  • +0

    はありません任意の適切な解決策はありません:-)何か今日を学習させ、ComponetListenerは正しい方法ではないですが、私は後にコンテナから汚いハックその非武装マウスを見て、参照してください。私の答えはここ – mKorbel

    +0

    aaaaaaaaccacc +1 – mKorbel

    4
    • あなたが直接リサイズ停止することはできません 、そのプロパティに基づいて構築されています、

    • であり、リサイズの制限は画面サイズ

    • 残りはそこAbsoluteLayoutに基づいて汚いハックがある、と私は

    • ブロックは、任意のちらつきがある場合は、サイズ変更または

    • のサイズを変更する時にフリーズすることを使用することを示唆していない
    • Resizing Components by @camickr

    • (コード付き)です
    +0

    +1と確認のために非常に構造化された答え –

    +0

    私はこのコードは私によって与えられた:-)によって、私は残念ではなく、 "ダリルバーク" ) –

    1

    ここでこのコード例を試してみてください。JDialogに垂直方向のサイズ変更が設定されていません。私は本当にこれを信用したくはありませんが、クレジット全体は "Darryl Burke"というプログラムの作成者に送られ、プログラムへのリンクはhereです。

    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); 
        } 
    } 
    
    +0

    Darrylは大好きです+1、やはり私は汚れたハックやjava.awt.Robotには同意しませんでした。テスト目的のためのAPIなので、プロダクションコードに指定されていないので、残念です。私の見解は、おそらく誰かがそれに気付くかもしれません。 – mKorbel

    +0

    Nah 、あなたの答えは他の答え、あまりにも真実、特定のものはOSによって制御されることを意図されており、それらは何の干渉もなくそのように扱われるべきです:-) –

    関連する問題