1. 程式人生 > >Java Swing 學習中遇到的問題記錄

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的第二列隱藏