1. 程式人生 > >java 圖形程式設定視窗(JFrame、JDialog)位置居於螢幕中央和父視窗中央的方法

java 圖形程式設定視窗(JFrame、JDialog)位置居於螢幕中央和父視窗中央的方法

原創文章,轉載請註明出處,謝謝!

一、視窗位於螢幕中央

以JFrame物件為例:

計算公式及核心程式碼

  int x = 螢幕寬度/2 - 視窗寬度/2

  int y = 螢幕高度/2 - 視窗高度/2


Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) screensize.getWidth() / 2 - window.getWidth() / 2;
int y = (int) screensize.getHeight() / 2 - window.getHeight() / 2;	
frame.setLocation(x, y);

二、視窗位於父視窗中央

以JDialog為例:

1、計算公式及核心程式碼

  int x = 父視窗X座標/2 + 父視窗寬度/2 - JDialog視窗寬度/2

  int y = 父視窗Y座標/2 + 父視窗高度/2 - JDialog視窗高度/2

//BasisDataProvider.MAIN_FRAME_LOC_X 是父視窗所處的x座標

////BasisDataProvider.MAIN_FRAME_LOC_Y 是父視窗所處的y座標

int x = BasisDataProvider.MAIN_FRAME_LOC_X - (int) subWindowSize.getWidth() / 2 + BasisDataProvider.MAIN_FRAME_WIDTH/2;
int y = BasisDataProvider.MAIN_FRAME_LOC_Y - (int) subWindowSize.getHeight() / 2 + BasisDataProvider.MAIN_FRAME_HEIGHT/2;
dialog.setLocation(x, y);

2、實時獲取父視窗座標的方法是給父視窗新增如下監聽

frame.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        System.out.println("視窗大小已被改變");
    }

    @Override
    public void componentMoved(ComponentEvent e) {
        Component comp = e.getComponent();
						
        System.out.println("當前視窗在螢幕中的位置:" + comp.getX() + "," + comp.getY());
						
        //更新當前視窗所在的座標
        BasisDataProvider.MAIN_FRAME_LOC_X = comp.getX();
        BasisDataProvider.MAIN_FRAME_LOC_Y = comp.getY();
						
    }
});  

三、總結:

如果視窗物件呼叫了pack()方法,那麼該視窗在應用上述方法後可能會在視覺上出現視窗偏離中央的情況,這時你需要取消呼叫pack()方法 或者 將主視窗的尺寸設定為元件一樣的尺寸。

前人栽樹後人乘涼,感謝某位前輩分享的監聽程式碼:

上述純個人拙見,若存在不準確的地方,懇請各位指正批評。