JAVA窗體使用小例子——不會使用布局怎么辦?事件怎么處理?


  我還是堅持一貫的作風,在JAVA窗體中不會布局就不用布局。凡事都不只有一種解決方案,我們總要先拿出解決方案,再考慮是否能夠做到最好。

  因為最近有一個朋友和我討論JAVA窗體中事件的基礎應用,我發現很多人喜歡之間讓自己的窗體實現ActionListener接口,我並不提倡這種做法,我個人還是喜歡使用匿名內部類,讓它的實現方法調用我預先准備的私有方法。

  好了,廢話不多說,我直接貼出代碼大家一看。我覺得其中有幾個地方需要注意,一是我自定義布局的方法;二是我對文件的搜索和信息訪問;三是對窗體組件事件的訪問。

  下面的代碼可以直接運行(注意包名),效果如下:

  

  可以指定文件夾下過濾顯示指定文件后綴的文件。

  1 package main;
  2 
  3 import java.awt.Dimension;
  4 import java.awt.Toolkit;
  5 import java.awt.event.ActionEvent;
  6 import java.awt.event.ActionListener;
  7 import java.io.File;
  8 import java.io.FilenameFilter;
  9 import java.text.SimpleDateFormat;
 10 import java.util.Arrays;
 11 
 12 import javax.swing.JButton;
 13 import javax.swing.JComboBox;
 14 import javax.swing.JFileChooser;
 15 import javax.swing.JFrame;
 16 import javax.swing.JLabel;
 17 import javax.swing.JPanel;
 18 import javax.swing.JScrollPane;
 19 import javax.swing.JTable;
 20 import javax.swing.JTextField;
 21 import javax.swing.UIManager;
 22 import javax.swing.UnsupportedLookAndFeelException;
 23 import javax.swing.event.DocumentEvent;
 24 import javax.swing.event.DocumentListener;
 25 import javax.swing.filechooser.FileSystemView;
 26 import javax.swing.table.DefaultTableModel;
 27 
 28 public class FrmFind extends JFrame {
 29     private JLabel lblPath; // 提示輸入路徑
 30     private JTextField txtPath; // 選擇后顯示路徑
 31     private JFileChooser fchPath; // 文件夾選擇
 32     private JButton btnPath; // 文件夾選擇按鈕
 33     private JLabel lblFix; // 后綴選擇
 34     private JTextField txtFix; // 后綴顯示
 35     private JComboBox comFix; // 已有后綴選擇
 36     private JButton btnFix; // 添加到過濾后綴列表
 37     private JTable tabFile; // 符合條件的文件列表
 38     private JPanel pnlFile; // 文件列表承載面板(列表為tabFile,它會被放置到下面的JScrollPane)
 39     private JScrollPane jspFile; // 文件列表承載面板,用來承載tabFile,而被pnlFile承載
 40 
 41     /**
 42      * 布局和屬性設置
 43      */
 44     private void initLayoutAndProperties() {
 45         setTitle("文件查找");
 46         setSize(800, 600);
 47         setDefaultCloseOperation(EXIT_ON_CLOSE);
 48         setLayout(null);
 49 
 50         // 設置窗體居中
 51         Toolkit kit = Toolkit.getDefaultToolkit();
 52         Dimension screenSize = kit.getScreenSize();
 53         int screenWidth = screenSize.width;
 54         int screenHeight = screenSize.height;
 55         int windowWidth = this.getWidth();
 56         int windowHeight = this.getHeight();
 57         setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2
 58                 - windowHeight / 2);
 59     }
 60 
 61     /**
 62      * 組件設置
 63      */
 64     private void initComponents() {
 65         // lblPath
 66         lblPath = new JLabel();
 67         lblPath.setSize(72, 12); // 賣了一下萌,一個個像素測試的,下面的也是……
 68         lblPath.setLocation(30, 18);
 69         lblPath.setText("請選擇路徑:");
 70         // txtPath
 71         txtPath = new JTextField();
 72         txtPath.setSize(400, 24);
 73         txtPath.setLocation(102, 13);
 74         txtPath.setEditable(false);
 75         txtPath.setText(FileSystemView.getFileSystemView().getHomeDirectory()
 76                 .toString()); // 默認顯示桌面路徑
 77         // fchPath
 78         fchPath = new JFileChooser();
 79         fchPath.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 文件瀏覽窗體只能選擇文件夾打開
 80         fchPath.setApproveButtonText("確定");
 81         fchPath.setCurrentDirectory(FileSystemView.getFileSystemView()
 82                 .getHomeDirectory()); // 文件瀏覽窗體默認打開桌面
 83         // btnPath
 84         btnPath = new JButton();
 85         btnPath.setText("選 擇");
 86         btnPath.setSize(55, 24);
 87         btnPath.setLocation(510, 13);
 88         btnPath.addActionListener(new ActionListener() {
 89 
 90             @Override
 91             public void actionPerformed(ActionEvent e) {
 92                 btnPath_Click();
 93             }
 94         });
 95         // lblFix
 96         lblFix = new JLabel();
 97         lblFix.setText("類型選擇:");
 98         lblFix.setLocation(30, 48);
 99         lblFix.setSize(60, 12);
100         // txtFix
101         txtFix = new JTextField();
102         txtFix.setSize(400, 24);
103         txtFix.setLocation(90, 42);
104         txtFix.setToolTipText("您可以手動錄入,請以“;”分開多個后綴");
105         txtFix.getDocument().addDocumentListener(new DocumentListener() { // 后綴的文本框文本發生改變時引發事件,都更新列表
106 
107                     @Override
108                     public void removeUpdate(DocumentEvent e) {
109                         loadList();
110                     }
111 
112                     @Override
113                     public void insertUpdate(DocumentEvent e) {
114                         loadList();
115                     }
116 
117                     @Override
118                     public void changedUpdate(DocumentEvent e) {
119                         loadList();
120                     }
121                 });
122         // comFix
123         String[] preList = { "jpg", "mp3", "rmvb", "txt", "torrent" }; // 默認的后綴列表,可以增加或刪減
124         comFix = new JComboBox(preList);
125         comFix.setEditable(false);
126         comFix.setSelectedIndex(0);
127         comFix.setSize(60, 24);
128         comFix.setLocation(500, 42);
129         // btnFix
130         btnFix = new JButton();
131         btnFix.setText("添加到過濾列表");
132         btnFix.setSize(112, 24);
133         btnFix.setLocation(570, 42);
134         btnFix.addActionListener(new ActionListener() {
135 
136             @Override
137             public void actionPerformed(ActionEvent e) {
138                 btnFix_Click();
139             }
140         });
141         // tabFile
142         tabFile = new JTable(new DefaultTableModel(null, new String[] { "文件名",
143                 "類型", "大小", "最后修改時間" }) {
144 
145             public boolean isCellEditable(int row, int column) {
146                 return false;
147             }
148         });
149         // pnlFile
150         pnlFile = new JPanel();
151         pnlFile.setLocation(30, 80);
152         pnlFile.setSize(720, 460);
153         // jspFile
154         jspFile = new JScrollPane();
155         jspFile.setViewportView(tabFile);
156         jspFile.setPreferredSize(pnlFile.getSize()); // 到凌晨3點半才搞定,這個主要是我對Java
157                                                         // Swing的布局非常不熟悉
158 
159         add(lblPath);
160         add(txtPath);
161         add(btnPath);
162         add(lblFix);
163         add(txtFix);
164         add(comFix);
165         add(btnFix);
166         pnlFile.add(jspFile);
167         add(pnlFile);
168     }
169 
170     /**
171      * “選擇”按鈕點擊事件
172      */
173     private void btnPath_Click() {
174         int result = 0;
175         result = fchPath.showOpenDialog(this);
176         if (JFileChooser.APPROVE_OPTION == result) {
177             txtPath.setText(fchPath.getSelectedFile().getPath());
178             loadList();
179         }
180     }
181 
182     /**
183      * “添加到過濾列表”按鈕點擊事件
184      */
185     private void btnFix_Click() {
186         if (txtFix.getText().indexOf(comFix.getSelectedItem().toString()) == -1) {
187             String fixFull = txtFix.getText();
188             if (!txtFix.getText().equals(""))
189                 fixFull += ";";
190             fixFull += comFix.getSelectedItem().toString();
191             txtFix.setText(fixFull);
192         }
193     }
194 
195     /**
196      * 通過選擇路徑和過濾后綴來加載符合條件的文件列表
197      */
198     private void loadList() {
199         File fPath = new File(txtPath.getText()); // 獲取文件夾路徑
200         File[] files = null; // 按需獲取文件
201         if (!txtFix.getText().equals("")) { // 需要過濾后綴的情況
202             final String[] fixs = txtFix.getText().split(";"); // 按照不同格式,由於上文規定,此處即使用";"拆分多個后綴
203             Arrays.sort(fixs); // 如果需要使用如下數組內查詢對象的方法,則需要現將數組進行排序,這點很重要
204             files = fPath.listFiles(new FilenameFilter() {
205 
206                 @Override
207                 public boolean accept(File dir, String name) {
208                     return Arrays.binarySearch(fixs,
209                             name.substring(name.lastIndexOf('.') + 1)) >= 0;
210                 }
211             });
212         } else
213             // 不需要過濾后綴的情況
214             files = fPath.listFiles();
215         DefaultTableModel dtm = (DefaultTableModel) tabFile.getModel(); // 開始對表格數據進行操作,先得到表模型
216         dtm.setRowCount(0); // 清除原數據
217         for (File file : files) { // 將文件信息逐個添加到行,此處我沒有詳細推敲
218             dtm.insertRow(
219                     dtm.getRowCount(),
220                     new String[] {
221                             file.getName(),
222                             file.isDirectory() ? "文件夾"
223                                     : file.getName()
224                                             .substring(
225                                                     file.getName().lastIndexOf(
226                                                             '.') + 1)
227                                             + "文件",
228                             file.length() % 1024 == 0 ? file.length() / 1024
229                                     + "KB" : file.length() / 1024 + 1 + "KB",
230                             new SimpleDateFormat("yyyy年MM月dd日 HH:mm")
231                                     .format(file.lastModified()) });
232         }
233     }
234 
235     public FrmFind() {
236         initLayoutAndProperties();
237         initComponents();
238         loadList();
239     }
240 
241     public static void main(String[] args) throws ClassNotFoundException,
242             InstantiationException, IllegalAccessException,
243             UnsupportedLookAndFeelException {
244         UIManager
245                 .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); // 設置程序UI模式,其實Java也就只自定義了幾種,看源代碼就能夠完全了解
246         new FrmFind().setVisible(true);
247     }
248 }

 

 歡迎您移步我們的交流群,無聊的時候大家一起打發時間:Programmer Union

 或者通過QQ與我聯系:點擊這里給我發消息

     (最后編輯時間2012-12-10 20:07:21)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM