最近在寫一個桌面應用,本來打算用c#的WinForm,但是考慮到以后可能會較多的接觸非可視化界面編程,而且不想再去寫那么多的sql語句,Hibernate也很好用,所以就采用swing來做一個簡單的界面。
用swing來開發界面完全是由代碼來拼裝界面,將每一個元控件放入更大的容器中,最后將最外層的容器顯示出來,就實現了最終的效果。
這里就不再詳寫swing的語法格式,而是將我遇到的問題分享給大家。
-JList的使用
-JScrollPane的使用
JList
在使用JList的時候,最開始想自定義它的Item,實現較多的交互,然后找到了 'ListCellRenderer'
JList有一個方法:
setCellRenderer(ListCellRenderer cellRenderer)
而ListCellRenderer就是用來展現JList的item的,可以重寫這個類,我向里面添加了一個JLabel和一個JButton,具體做法為新建一個類,繼承JPanel,并實現ListCellRenderer接口:
public class ImageButtonListRenderer extends JPanel implements
ListCellRenderer<ImageButtonItem> {
@Override
public Component getListCellRendererComponent(
JList<? extends ImageButtonItem> list, ImageButtonItem value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel jLabel = new JLabel(value.getText());
JButton jButton = new JButton(value.getButtonText());
Icon icon = new ImageIcon("E:\\下載\\icon\\download.png");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(index+"");
}
});
jButton.setIcon(icon);
removeAll();
add(jLabel);
add(jButton);
return this;
}
}
其中ImageButtonItem為自定義類,提供item的數據。
運行后Button成功的顯示在了JList的item上:
但是點擊這個Button卻無任何響應,后來搜索后發現了這個答案:
Stackoverflow-JButton in JList cell is not clickable
意思是這個Button僅僅是被繪制在了JPanel上,并不能接收到任何事件。
看來只能找其他的方法了。
既然JList是多個item的顯示,我們為什么不自己畫出每一條item呢。
于是就采用較為原始的方法,用for循環實例化多個JPanel控件,每一個JPanel控件包含一個JLabel和一個JButton,每生成一個JPanel,就向其中添加這兩個控件并且綁定數據,然后為JButton添加點擊事件,最后將JPanel添加到GroupPanel中(這里采用了開源的WebLaf 一個簡單的使用幫助:How-to-use-WebLaF)。由于數據項較多,屏幕顯示不完全,所以將GroupPanel置于JScrollPane中。最后使用TestFrame.show(JScrollPane)將之顯示出來。
在將GroupPanel添加到JScrollPane中的時候,出現一點問題,由于同時設置了GroupPanel和JScrollPane的setPreferredSize,導致JScrollPane的滾動條顯示出現問題,解決也很簡單,取消GroupPanel的設置就好。