Java很多地方都很不錯,不過他的swing一直是我覺得最難看之處。之前面試一家公司的時候被要求寫一個Java界面,由於太久沒寫過,感覺很生疏,所以現在想重溫一下。只是工作這麼久,還沒見過用Java寫界面的。不知是不是沒什麼人用呢?
廢話少說,一步到位,呵呵。現在研究不深,只講功能,不講效率,各位將就着看吧。
package usage; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.KeyStroke; import javax.swing.filechooser.FileNameExtensionFilter; /** * * @Date: 2013-11-14 上午10:41:14 * @Author: gyh * @TODO: */ public class NodePad extends JFrame implements ActionListener { private Container contentPane; private Font commonFont = new Font("宋體", Font.PLAIN, 18); private Font statusFont = new Font("宋體", Font.PLAIN, 12); private Color color = Color.GRAY; private JTextArea showArea;// 主要文本顯示區 private JToolBar status;// 狀態欄 private JTextField statusField;// 狀態欄中用於顯示文字的地方 public NodePad() { contentPane = getContentPane();// 獲取容器(即容器)本身 this.setTitle("First Frame");// 設置標題 Dimension size = Toolkit.getDefaultToolkit().getScreenSize();// 獲取屏幕分辨率 this.setLocation((size.width - size.width / 2) / 2,(size.height - size.height / 2) / 2);// 設置居中 this.setSize(size.width / 2, size.height / 2);// 設置大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 設置退出時動作。如果不設置這東東,即使你關了界面,它還會活在進程中 contentPane.setLayout(new BorderLayout());// 設置容器佈局 this.setResizable(true);// 設置可惜重置大小 init(); this.setVisible(true);// 設置可見 } // 初始化系統組件 private void init() { contentPane.add(getMenuBars(), BorderLayout.NORTH);// 添加菜單欄 showArea = new JTextArea();// 添加文本域 showArea.setFont(commonFont);// 設置文本域字體 showArea.setLineWrap(true);// 設置自動換行 JScrollPane scroll = new JScrollPane(showArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);// 給文本域添加滾動條 contentPane.add(scroll, BorderLayout.CENTER); status = new JToolBar(); statusField = new JTextField("就緒.."); statusField.setFont(statusFont); statusField.setForeground(color); statusField.setEditable(false);// 設置狀態欄文字不可編輯 status.add(statusField); status.setEnabled(false);// 設置狀態欄不可移動 contentPane.add(status, BorderLayout.SOUTH); } /** * '文件'菜單 * * @return */ private JMenuBar getMenuBars() { JMenuBar menuBar = new JMenuBar();// 菜單欄 JMenu fileMenu = new JMenu("文件"); fileMenu.setMnemonic(KeyEvent.VK_F);// 快捷鍵,用alt+o就可以按出來 JMenuItem open = new JMenuItem("打開"); open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.ALT_MASK));// 快捷鍵,用alt+f就可以按出來 JMenuItem save = new JMenuItem("保存"); save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.ALT_MASK));// 快捷鍵,用alt+f就可以按出來 fileMenu.addSeparator();// 一條橫線,美觀用 JMenuItem exit = new JMenuItem("關閉"); exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.ALT_MASK));// 快捷鍵,用alt+q就可以按出來 // 添加事件監聽器,注意要繼承ActionListener接口,並實現actoinPerformed方法 open.addActionListener(this); open.setActionCommand("open"); save.addActionListener(this); save.setActionCommand("save"); exit.addActionListener(this); exit.setActionCommand("exit"); menuBar.add(fileMenu);// 將文件菜單加入菜單欄 // 將按鈕加入文件菜單中 fileMenu.add(open); fileMenu.add(save); fileMenu.add(exit); return menuBar; } public static void main(String[] a) { new NodePad(); } @Override public void actionPerformed(ActionEvent e) { // 退出 if (e.getActionCommand().equals("exit")) { System.exit(0); } // 如果“打開”按鈕被按到 if (e.getActionCommand().equals("open")) { JFileChooser openFile = new JFileChooser("打開文件");// 添加文件打開窗口 openFile.setAcceptAllFileFilterUsed(false);// 去掉'顯示全部'這個選項 openFile.addChoosableFileFilter(new FileNameExtensionFilter("ini文件", "ini"));// 文件過濾 openFile.addChoosableFileFilter(new FileNameExtensionFilter("txt文件", "txt")); int val = openFile.showOpenDialog(this); BufferedReader br = null; if (val == JFileChooser.APPROVE_OPTION) { File file = openFile.getSelectedFile(); try { br = new BufferedReader(new FileReader(file)); showArea.setText(""); String line = ""; // 讀取文件 while ((line = br.readLine()) != null) { showArea.append(line + "\n"); } statusField.setText("成功打開"); } catch (FileNotFoundException fnfe) { statusField.setText("找不到文件"); } catch (IOException ioe) { statusField.setText("讀取文件錯誤"); } finally { try { if (br != null)br.close();// 不要忘記關閉流 } catch (IOException e1) { } } } } //如果“保存”按鈕被按到 if (e.getActionCommand().equals("save")) { JFileChooser saveFile = new JFileChooser("保存"); saveFile.setAcceptAllFileFilterUsed(false); saveFile.addChoosableFileFilter(new FileNameExtensionFilter("ini文件", "ini"));// 文件過濾 saveFile.addChoosableFileFilter(new FileNameExtensionFilter("txt文件", "txt")); int val = saveFile.showSaveDialog(this); if (val == JFileChooser.APPROVE_OPTION) { File selectedFile = saveFile.getSelectedFile();// 獲取選中文件 String fileName = selectedFile.getName(); if (fileName.lastIndexOf(".") == -1) {// 如果用戶沒有添加後綴(即沒有'.'號),則要爲它加上 String selectedExtension = saveFile.getFileFilter().getDescription();// 獲取選中後綴描述(即“ini文件”等) String end = selectedExtension.substring(0,selectedExtension.lastIndexOf("文件")); fileName = fileName + "." + end; } String filePath = selectedFile.getParent() + "\\";// 取出路徑 File newFile = new File(filePath + fileName); BufferedWriter bw = null; try { if (newFile.exists()) {//如果文件已存在,提醒用戶 int result = JOptionPane.showConfirmDialog(null,"文件已存在,確定要覆蓋嗎?"); if (result == JOptionPane.DEFAULT_OPTION) newFile.createNewFile(); else return; } else { newFile.createNewFile(); } // 開始寫文件 bw = new BufferedWriter(new FileWriter(newFile)); bw.write(showArea.getText()); bw.flush(); statusField.setText("存儲成功"); } catch (IOException e1) { statusField.setText("存儲出錯"); } finally { try { if (bw != null)bw.close();// 不要忘記關閉流 } catch (IOException e1) { } } } } } }
另外,有誰知道怎麼設置代碼格式嗎,這樣好難看。