swing 圆角按钮_JFrame实现圆角窗体
現在開發一個窗體程序,經常要求用圓角窗體。而在Windows 經典外觀下,直接寫出來的窗體卻是方型的。在windows 7、windows server2008 的外觀下,就已經是圓角的了。
這里我們手動實現圓角,從而與系統外觀不相關。
通過sun的內部api(包含在jdk中)來實現。這里只需調用一個方法就OK:
AWTUtilities.setWindowShape(win,
new RoundRectangle2D.Double(0.0D, 0.0D, win.getWidth(),
win.getHeight(), 6.0D, 6.0D));
其中win即為要實現圓角的窗體。
在實際顯示窗體時,發現始終還是顯示的是方角(非win7和server2008);原來JFrame在默認情況下是使用本地默認的外觀來繪制自己的外觀的。所以這里要實現方角就要禁用本地外觀。通過如下來方法設置:
JFrame.setDefaultLookAndFeelDecorated(true);
注意:該方法必須在定義窗體置前調用,否則將不起作用。
通過該方法設置后,JDK將采用跨平臺的外觀繪制窗體,從而上面設置圓角窗體的方法也起作用了。
完整代碼如下:
public class JRoundFrame extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
JRoundFrame frame = new JRoundFrame();
frame.setSize(new Dimension(200, 300));
/** 設置圓角 */
AWTUtilities.setWindowShape(frame, new RoundRectangle2D.Double(
0.0D, 0.0D, frame.getWidth(), frame.getHeight(), 26.0D,
26.0D));
frame.setVisible(true);
}
});
}
}
可以看到設置后的窗體已經變為圓角了。
但是跨平臺的外觀不咋的。要實現美化外觀也能實現圓角呢。
如果不調用JFrame.setDefaultLookAndFeelDecorated(true);使用java的跨平臺外觀。
則要實現圓角,就必須得自己重寫窗體了。
如果我們不對窗體進行裝飾(調用setUndecorated(true),即不顯示窗體的邊框),這樣也能成功設置為圓角窗體。
這就只是將船體的body部分顯示為圓角了,邊框已經隱藏了。效果如下:
這樣也完美的實現了圓角邊框,只是這個窗體不能拖動,不能改變大小。所以還得自己為該窗體添加標題欄,添加按鈕實現關閉、最大化、最小化、同時監聽鼠標的拖動等功能。
當然上面的方法,只是設置了窗體的初始形狀為圓角邊框。如果要保持窗體一直為圓角(窗體的大小改變后也為圓角),則就必須實現對窗體大小改變事件的監聽。即
對窗體調用addComponentListener方法添加ComponentListener監聽。且在窗體大小改變時,同步修正窗體的形狀為圓角邊框就OK,監聽類代碼如下:
private class ComponentHandler extends ComponentAdapter {
private ComponentHandler() {
}
@Override
public void componentResized(ComponentEvent e) {
Window win = (Window) e.getSource();
Frame frame = (win instanceof Frame) ? (Frame) win : null;
if ((frame != null)
&& ((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) != 0)) {
AWTUtilities.setWindowShape(win, null);
} else {
/** 設置圓角 */
AWTUtilities.setWindowShape(win,
new RoundRectangle2D.Double(0.0D, 0.0D, win.getWidth(),
win.getHeight(), 26.0D, 26.0D));
}
}
}
總結
以上是生活随笔為你收集整理的swing 圆角按钮_JFrame实现圆角窗体的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: ios获取新数据要不要关_iOS开发之数
 - 下一篇: ui动效 unity_Unity - U