Java Swing 學習中遇到的問題記錄
問題一、焦點在單元格時,點選儲存按鈕獲取不到正在編輯單元格的資料
原因:使用者正在編輯單元格時,點選table之外的元件,單元格還是處於編輯狀態,此時如果點選的是“儲存”按鈕,由於單元格並沒有接受使用者的輸入,導致當前編輯的單元格的值為null,使用者輸入的資料沒有儲存。
同時,由於表格中的所有單元格是共用一個CellEditor,當用戶新建一行時,通常會讓游標移動到新建的行的某一個單元格,此時原來正在編輯的
單元格就會替換到新增加的行中,而之前單元格的輸入的內容沒有儲存。因此,在觸發其他操作之前,最好能夠取消表格正在編輯的狀態。
解決方法:
方法一:
JTable table = new JTable();
table.setClientProperty("terminateEditOnFocusLost",Boolean.TRUE);
該方法在最小化時,失效;
方法二:
if(table.isEidting)
table.getCellEidtor().stopCellEidting();
這種方法,根據需要來設定,比如需要在點選【儲存】按鈕時,獲取整個table資料,就可以在這個按鈕上新增事件處理;
問題二、取消窗體預設的Java咖啡圖示、三個預設按鈕(最小化、最大、退出)
JFrame frame = new JFrame();
frame.setUndecorated(true);
設定完該屬性之後,窗體不能移動、不能縮小、放大、關閉;
2.1、實現窗體移動功能(要點:起始位置、移動距離)
給窗體新增2個監聽器:
1、MouseListener();
實現方法:
mousePressed(MouseEvent e);
在該方法中記錄,在滑鼠剛按下時mouse的座標(得到移動的初始位置);
Point start = e.getPoint();
2、MouseMotionListener();
實現方法:
mouseDragged();//窗體被拖動時觸發的事件;
得到移動終點mouse位置,Point end = e.getPoint();
得到元件(frame)移動起點位置:
Point fStart = getLocation();
元件最終位置的座標計算公式 :起始座標+移動向量=終點座標
int fEndx = fStart .x +(end.x - start.x);
int fEndy = fStart.y +(end.y-start.y);
setLocation(fEndx ,fEndy );//設定元件最終位置;
2.2、窗體放大到全屏和還原(要點:放大前位置、放大前大小)
放大的原理很簡單,就是將窗體的size設定成整個螢幕的大小,填充整個螢幕;
因此問題關鍵:得到螢幕的size;通過方法:
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
在放大填充全屏時,呼叫:
frame.setBounds(0,0,d.width,d.height);//這裡注意,應該把frame位置設定為(0,0),這樣才可以填充整個螢幕;如若不設定frame位置,由於frame初始位置不在(0,0)因此在螢幕中可以看到空白部分;
還原到放大前的狀態:需要知道:放大前位置、放大前大小;因此在放大前儲存大小和位置即可;
frame.setBounds(oldx,oldy,old.width,old.height);
問題三、如何隱藏button的邊框、button被點選之後button中字型的邊框
設定button屬性:
setBorderPainted(false);//隱藏:button邊框;
setFocusPainted(false);//隱藏:button被點選時字型周圍顯現的邊框
問題四:在有佈局管理器時,如何設定元件的大小;
setPreferredSize(new Dimension(xx,xx));
問題五、如何隱藏table中的某一列
table.getTableHeader().getColumnModel().getColumn(1).setMinWidth(0);
table.getTableHeader().getColumnModel().getColumn(1).setMaxWidth(0);
將要隱藏列的列寬:最大值、最小值設定為0;
這個列子中選中table的第二列隱藏