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)

posted @ 2012-12-10 20:09  云中双月  阅读(6720)  评论(0编辑  收藏  举报