上一篇講解了如何驗證特定的 PC,這篇就延伸這個案子,來看看 Java
的一些 GUI 元件吧!
透過 Java
可以跟 Android
一樣,做到一些 gui 元件的呈現,這在自己寫了 Android
之後,再來寫 Java
的 Swing
特別有感覺。
以一個 Frame
來講好了,我使用了許多的 JPanel
去當作 ViewGroup
來使用,這專案用到了 JButton
、 JLabel
等等的小元件,其中想特別記錄一下比較麻煩的元件 JTable
JTable
這個元件需要兩個參數,分別是 headers
以及 data
,並且把整個 JTable
包進去 JScrollPane
裡面,才能讓超出畫面的 row 被捲動。
麻煩事麻煩在想對每個 Item 做客製化動作的時候,需要另外寫一個 instance,去設定 table 的 DefaultTableCellRenderer
,如下,我想要在每個 cell 的外框加上一個 border,那就需要透過下面的方法實作出來。
private static class BorderColorRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Border border;
switch (column) {
case 1:
border = BorderFactory.createMatteBorder(0, 2, 0, 0, Color.BLACK);
break;
case 2:
border = BorderFactory.createLineBorder(new Color(2,2,2,34), 3);
break;
...
}
JComponent comp = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
comp.setBorder(border);
return comp;
}
先透過 BorderFactory
去產生一個 border(有分很多種種類),然後再繼承原先的 cell 的這個 component,之後再去對他做更改。
這裡一開始搞蠻久的,因為他的 default 值是一個不太好看的大藍色,當按下某一個 cell ,整條 row 就會變色,想把他移除掉。而一開始一直在 setSelectionBackground
這邊做嘗試,嘗試想要把背景顏色調成透明,又發現 not work。
後來還搭配著點擊背景可以移除裡面 cell 的 focus ,得到以下的解法
在背景的 layout
this.addMouseListener(new MouseListener() {
...
@Override
public void mousePressed(MouseEvent e) {
JComponent comp = (JComponent) e.getSource();
comp.requestFocus();
// TODO Auto-generated method stub
}
...
});
在這個 table
table.setRowSelectionAllowed(false);
才知沒辦法從顏色下手,而是要從根本的禁止被選擇,那就不會出現那條藍色背景拉!