----------------siwuxie095 ide
根面板 contentPane 的默認佈局爲 Border Layout,將其 佈局
切換爲 Absolute Layout 動畫
Absolute Layout 即 絕對佈局,即 它沒有任何的限制,能夠 spa
在界面中任意擺放控件的位置 線程
在將控件拖動到面板上時,會出現參考線,參考線僅僅是 blog
爲了在界面中擺放元素時給出參考,而不具備任何實質性 事件
的吸附功能 get
「若是不使用參考線,能夠自由的將控件移動到任何位置」 it
當在面板中擺放好某控件,該控件的座標和大小都是固定的, io
不會隨窗體的縮放而產生任何變化
在絕對佈局的狀況下,能夠在代碼中任意修改元素的座標和大小
向 contentPane 中添加一個 JLabel,將其文本(text)改成:
This is a label,Rename 爲:label
在 Source 中修改代碼:
效果以下:
向 contentPane 中添加一個 JButton,將其文本(text)改成:
Run,Rename 爲:btnRun
在絕對佈局中,雖然不會有佈局管理器幫助擺放,可是能夠提供
最佳的靈活性
如:能夠編寫一個線程來爲當前的控件提供動畫(放大縮小、位置移動)
爲 JButton 添加鼠標點擊事件,當點擊 Run 時,JLabel 上下浮動
JButton btnRun = new JButton("Run"); btnRun.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) {
//建立一個 SwingWoker 線程,指定泛型爲 String 和 Integer //要覆蓋 doInBackground() 和 process() 方法 //建立完成後,須要調用 execute() 方法,將它運行 new SwingWorker<String, Integer>() {
//獲取 Y 的原座標,須要將 label 的聲明轉移到類中 int originalY=label.getY();
@Override protected String doInBackground() throws Exception { while (true) { //每隔 50 毫秒執行一次 Thread.sleep(50); //System.currentTimeMillis() 即 1970年到當前時間的毫秒值 //先從整型轉換成浮點型,又從浮點型轉換成整型 // 100 表示運動的快慢(越小速度越快,反比), // 20 表示運動的幅度(越小幅度越小,正比) //將值 publish() 到 process() 中 publish((int)(Math.sin(System.currentTimeMillis()/100)*20)); } }
@Override protected void process(List<Integer> chunks) { //從 chunks 中把值取出來 for (int dynamicY : chunks) { //X 座標不變,Y 座標變化,爲標籤作了一個正弦的動畫 label.setLocation(label.getX(), originalY+dynamicY); } }
}.execute(); } }); |
效果以下:
在絕對佈局中,當控件出現重疊時,層級高的控件會擋住
層級低的控件,並接收鼠標事件
【made by siwuxie095】