JAVA Swing

最近在寫一個桌面應用,本來打算用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上:

捕獲.PNG

但是點擊這個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)將之顯示出來。

捕獲1.PNG

在將GroupPanel添加到JScrollPane中的時候,出現一點問題,由于同時設置了GroupPanel和JScrollPane的setPreferredSize,導致JScrollPane的滾動條顯示出現問題,解決也很簡單,取消GroupPanel的設置就好。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容