2012-05-08 82 views
5

可能重複:
JDialog allow user to only change width of the dialog的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); 
    } 
}); 

問題是,窗口大小後的代碼被調用。調整窗口大小然後閃爍。

我想這樣做,當用戶拖動窗口的高度時,它什麼都不做。

+0

+1,你讓我學到的東西今天:-) –

回答

3

看起來像你不能。有一個setResizable()方法,但它的全或無。
您可以嘗試通過在您的JDialog中使用佈局來緩解這種情況,以便無論JDialog高度如何,您的內容都保持相同高度,或者可能(稍微偏激一點)將其設置爲不可調整大小,並實現您自己的鼠標偵聽器來調整大小你自己?這樣你可以完全控制

3

經過一段時間後,我找不到任何令人滿意的解決方案。我認爲對話框的大小調整是直接在操作系統級別處理的,因此您只能說您希望它完全不可調整大小或完全可調整大小。

以下代碼將始終阻止對話框變大,但當用戶調整對話框大小時,對話框的邊框仍會移動。

另一個選項,也是由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); 

    } 
} 
+0

沒有沒有任何妥善的解決辦法,ComponetListener是不正確的方式,我看到了骯髒的黑客從容器非武裝鼠標後,請參閱我的答案在這裏 – mKorbel

+0

aaaaaaaaaccch +1 – mKorbel

4
  • 你不能直接停止調整大小,

  • 你不能阻止容器的基本性質,

  • becase的容器從本機OS和建立在其屬性,

  • 和調整大小的限制是屏幕大小

  • 其餘都是(有代碼)Resizing Components by @camickr

  • 有基於AbsoluteLayout骯髒的黑客,如果有任何閃爍,我不建議使用該

  • 塊大小或凍結期間調整

+0

+1確認和非常結構化的答案 –

+0

我剛剛發現這可以通過我給出的代碼來完成:-)抱歉,不是由我,而是由「Darryl Burke」: - ) –

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 ,而你的答案和答案一樣好Ÿ其他答案,也是如此,某些事情是由操作系統控制的,他們應該這樣對待,沒有任何干涉:-) –