在JDK1.4以前,我們只有一種方式來去掉窗口的標題欄,那就是直接使用JWindow,用JWindow來代替JFrame使用。但用過JWindow的人一定知道,JWindow在操作系統的任務欄是不可見的,這樣我們就無法在幾個視窗之間來切換到這個窗口了。
使用JWindow也是很多人知道的一種去掉標題欄的方式。但從Java1.4開始,有一種新的方式可以使用,我們來看看。
現在我們創建一個類並繼承於JFrame,
public class DecoratedFrame extends JFrame {
public DecoratedFrame() {
this.getContentPane().add(new JLabel("Just a test."));
this.setUndecorated(true); // 去掉窗口的裝飾
this.getRootPane().setWindowDecorationStyle(JRootPane.NONE); //采用指定的窗口裝飾風格
this.setSize(300,150);
}
public static void main(String[] args) {
JFrame frame = new DecoratedFrame();
frame.setVisible(true);
}
}
請看加了注釋的兩行,要去掉標題欄,關鍵代碼就是這兩行,第1行去掉窗口的裝飾,第2行為窗口指定頭飾風格。在這裡,可以通過調用this.getRootPane().setWindowDecorationStyle()方法為窗口指定以下的裝飾風格:
NONE 無裝飾(即去掉標題欄)
FRAME 普通窗口風格
PLAIN_DIALOG 簡單對話框風格
INFORMATION_DIALOG 信息對話框風格
ERROR_DIALOG 錯誤對話框風格
COLOR_CHOOSER_DIALOG 拾色器對話框風格
FILE_CHOOSER_DIALOG 文件選擇對話框風格
QUESTION_DIALOG 問題對話框風格
WARNING_DIALOG 警告對話框風格
在使用Jframe的時候,普遍都會有標題欄,還有最小化,最大化,關閉按紐的,還要實現拖動窗體的功能。
這樣的話,對我們實現自定義樣式的窗體是很有影響的,
1) 要去掉標題欄:
jFrame.setUndecorated(true);
// 這樣就可以去掉Jframe中對window的裝飾了,
2) 去掉標題欄,我們就有可能要給程序寫代碼提供最小化,最大化,關閉的操作,如何實現?
只要給按紐添加MouseListener,
在mouseClick中的調用
jFrame.setExtendedState(jFrame.ICONIFIED); //最小化
if(jFrame.getExtendedState() != jFrame.MAXIMIZED_BOTH)
jFrame.setExtendedState(jFrame.MAXIMIZED_BOTH);
else
jFrame.setExtendedState(jFrame.NORMAL);
// 最大化或正常狀態
System.exit(0);
// 關閉,退出程序
3) 要拖動窗體的功能:
只要給窗體中的某個組件添加如下代碼就行了:
Point loc = null;
Point tmp = null;
boolean isDragged = false;
private void setDragable() {
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent e) {
isDragged = false;
jFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public void mousePressed(java.awt.event.MouseEvent e) {
tmp = new Point(e.getX(), e.getY());
isDragged = true;
jFrame.setCursor(new Cursor(Cursor.MOVE_CURSOR));
} });
this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(java.awt.event.MouseEvent e) {
if(isDragged) {
loc = new Point(jFrame.getLocation().x + e.getX() - tmp.x, jFrame.getLocation().y + e.getY() - tmp.y);
jFrame.setLocation(loc);
}
}
});
}
在初始化該組件的時候調用 setDragable() 就可以使組件具體拖放窗體的功能了。因為可能有背景圖,可能會重寫paint方法,不能在paint方法中調用setDragable()