今天,我完成了结束进程的功能,并且可以实现每隔一段时间来更新进程表格。并且如果在表格鼠标左键之后,完成结束进程之后才能继续更新。
package wl; import java.awt.BorderLayout; import java.awt.Choice; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Frame; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.MouseEvent; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.border.Border; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; public class ProcessApp extends JFrame { static JFrame f = new JFrame("Process"); static JPopupMenu m_popupMenu;// 弹出式菜单、右键菜单 static JPanel panel = new JPanel(); static Object[][] cellData = { { "名称", "PID", "优先级", "状态", "用户名", "cpu", "内存", "描述" } }; static String[] columnNames = { "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8" }; static JTable table = new JTable(cellData, columnNames); static int focusedRowIndex=-1;//table mouse row number static List<processModel> processs=new ArrayList<processModel>(); static boolean isUpdate=true;//是否更新:当鼠标左键按下后不再更新进程,当过去5秒后继续更新 private static ProcessApp p=new ProcessApp(); ProcessApp() {// init frame f.setVisible(true); f.setSize(1000, 800); f.setLayout(new BorderLayout()); } void initMenu() {// init menu JMenuBar menubar = new JMenuBar(); JMenu[] menus = new JMenu[] { new JMenu("文件"), new JMenu("选项"), new JMenu("查看") }; for (int i = 0; i < menus.length; i++) { menubar.add(menus[i]); } f.setJMenuBar(menubar); } void initToolBar() { JToolBar toolbar = new JToolBar(); JButton[] buttons = new JButton[] { new JButton("应用"), new JButton("进程"), new JButton("性能"), new JButton("联网"), new JButton("用户"), new JButton("性能") }; for (int i = 0; i < buttons.length; i++) { toolbar.add(buttons[i]); buttons[i].setFont(f.getFont().deriveFont(Font.PLAIN, 18f)); } toolbar.setBackground(Color.white); f.getContentPane().add(toolbar, BorderLayout.NORTH); } void initPanel() { panel.setBackground(Color.WHITE); f.getContentPane().add(panel, BorderLayout.CENTER); } void initTable() { // (1)名称,优先级,cpu,内存,磁盘,网络,GPU的使用情况,端口,用户名,状态,描述 table.setSize((int) (panel.getWidth() * 0.2), 40); table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); String[] headers = { "名称", "PID", "优先级", "状态", "用户名", "cpu", "内存", "描述" }; DefaultTableModel model = new DefaultTableModel(cellData, headers) { public boolean isCellEditable(int row, int column) { return false; } }; table = new JTable(model); panel.add(table); createPopupMenu();// 创建鼠标点击事件 } void setTable() { System.out.println("setTable"); TableModel tableModel = table.getModel(); int rows = table.getRowCount();//get table rows System.out.println(rows); while(rows>1) {//if update not update finish,continue delete rows ((DefaultTableModel) tableModel).removeRow(0);// rowIndex是要删除的行序号 rows = table.getRowCount();//get table rows } // "名称","PID","优先级","状态","用户名","cpu","内存","描述" processs = process.Getprocess(); int i=0; for (processModel p : processs) { String[] arr = new String[8]; arr[0] = p.getName(); arr[1] = p.getPID(); arr[2] = p.getPrio(); arr[3] = p.getState(); arr[4] = p.getUser(); arr[5] = Double.toString(p.getB_cpu()); arr[6] = Double.toString(p.getB_memory()); //arr[7] = p.getDescribe(); arr[7]=String.valueOf(i); i++; //System.out.println(arr[0]+" "+arr[7]); // 添加数据到表格 ((DefaultTableModel) tableModel).addRow(arr); } // 更新表格 table.invalidate(); table.setSize(panel.getWidth() - 20, panel.getHeight()); // JTable对象添加点击事件 table.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { isUpdate=false; jTable1MouseClicked(evt); } }); } // 设置滚动条 void setScrollPane() { JScrollPane jsp; jsp = new JScrollPane(table); panel.add(jsp); } //table点击事件 private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { mouseRightButtonClick(evt); } //鼠标右键点击事件 private void mouseRightButtonClick(java.awt.event.MouseEvent evt) { // 判断是否为鼠标的BUTTON3按钮,BUTTON3为鼠标右键 if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) { // 通过点击位置找到点击为表格中的行 focusedRowIndex = table.rowAtPoint(evt.getPoint()); if (focusedRowIndex == -1) { System.out.println(focusedRowIndex); } // 将表格所选项设为当前右键点击的行 table.setRowSelectionInterval(focusedRowIndex, focusedRowIndex); // 弹出菜单 m_popupMenu.show(table, evt.getX(), evt.getY()); } } public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { int selIndex = table.rowAtPoint(e.getPoint()); System.out.println(selIndex); } } //创建鼠标点击事件 private static void createPopupMenu() { m_popupMenu = new JPopupMenu(); JMenuItem[] MenuItem = new JMenuItem[7]; for (int i = 0; i < MenuItem.length; i++) { MenuItem[i] = new JMenuItem(); } MenuItem[0].setText(" 结束进程 "); MenuItem[1].setText(" 结束进程树 "); MenuItem[2].setText(" 设置优先级 "); JMenu menu = new JMenu(" 资源值 "); JMenuItem m1 = new JMenuItem(); JMenuItem m2 = new JMenuItem(); m1.setText("值"); m2.setText("百分比"); menu.add(m1); menu.add(m2); MenuItem[3].setText(" 创建转储文件 "); MenuItem[4].setText(" 打开文件所在位置 "); MenuItem[5].setText(" 属性 "); m_popupMenu.add(MenuItem[0]); m_popupMenu.add(MenuItem[1]); m_popupMenu.add(MenuItem[2]); m_popupMenu.add(MenuItem[3]); m_popupMenu.add(MenuItem[4]); m_popupMenu.add(MenuItem[5]); m_popupMenu.add(MenuItem[6]); m_popupMenu.add(menu); MenuItem[0].addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { // 该操作需要做的事 String pid=processs.get(focusedRowIndex-1).getPID(); process.Killprocess(pid); p.setTable(); isUpdate=true;//操作完成,继续更新 } }); m1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { // 该操作需要做的事 System.out.println("该操作需要做的事"); } }); m2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { // 该操作需要做的事 System.out.println("该操作需要做的事"); } }); } public static void main(String[] args) { p.initMenu(); p.initToolBar(); p.initPanel(); p.initTable(); p.setTable(); p.setScrollPane(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Boolean result = false; int count = 0; while(!result) { try { Thread.sleep(5000); //设置暂停的时间 5 秒 if(isUpdate==true) { count ++ ; p.setTable(); System.out.println(sdf.format(new Date()) + "--循环执行第" + count + "次"); /*if (count == 3) { result = true; break ; }*/ } } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("finish"); } }
package wl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; public class process { //kill -9 [PID] public static void Killprocess(String pid) { Runtime runtime = Runtime.getRuntime(); List<String> tasklist = new ArrayList<String>(); java.lang.Process process = null; try { /* * * 自适应执行查询进程列表命令 * */ Properties prop = System.getProperties(); // 获取操作系统名称 boolean is=false; String os = prop.getProperty("os.name"); if (os != null && os.toLowerCase().indexOf("linux") > -1) { // 1.适应与linux BufferedReader reader = null; // 显示所有进程 //"名称","PID","优先级","状态","用户名","cpu","内存","磁盘","网络","描述" process = Runtime.getRuntime().exec("kill -9 "+pid); System.out.println("kill process"); } } catch (Exception e) { e.printStackTrace(); } } //get process infomation public static List<processModel> Getprocess() { Runtime runtime = Runtime.getRuntime(); List<String> tasklist = new ArrayList<String>(); java.lang.Process process = null; List<processModel> processs=new ArrayList<processModel>(); int count = 0; // 统计进程数 try { /* * * 自适应执行查询进程列表命令 * */ Properties prop = System.getProperties(); // 获取操作系统名称 boolean is=false; String os = prop.getProperty("os.name"); if (os != null && os.toLowerCase().indexOf("linux") > -1) { // 1.适应与linux BufferedReader reader = null; // 显示所有进程 //"名称","PID","优先级","状态","用户名","cpu","内存","磁盘","网络","描述" process = Runtime.getRuntime().exec("top -b -n 1"); reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { if(line.startsWith(" PID")) { is=true; line=reader.readLine(); } if(is==true) { Pattern p = Pattern.compile("\s+"); Matcher m = p.matcher(line); line= m.replaceAll(","); String[] strs=line.split(","); processModel pro=new processModel(); pro.setPID(strs[1]); pro.setUser(strs[2]); pro.setPrio(strs[3]); pro.setMemory(Double.valueOf(strs[4])); pro.setState(strs[8]); pro.setB_cpu(Double.valueOf(strs[9])); pro.setB_memory(Double.valueOf(strs[10])); pro.setName(strs[12]); //gSystem.out.println(pro.toString()); processs.add(pro); } } } } catch (Exception e) { e.printStackTrace(); } System.out.println(processs.get(0).toString()); return processs; } public static void main(String[] args) throws Exception { //System.out.println(Getprocess());; Killprocess("1239"); //installTool("iotop"); } }