/** * Created : Apr 12, 2012 * * @author pquiring */ import java.util.*; import javax.swing.*; import javax.swing.table.*; import javaforce.*; public class MainPanel extends javax.swing.JPanel { /** * Creates new form MainPanel */ public MainPanel() { initComponents(); restartTimer(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); terminate = new javax.swing.JButton(); kill = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); showAllUsers = new javax.swing.JCheckBox(); showRoot = new javax.swing.JCheckBox(); jLabel2 = new javax.swing.JLabel(); speed = new javax.swing.JSlider(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); resCPU = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); resMemory = new javax.swing.JLabel(); terminate.setText("Terminate"); terminate.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { terminateActionPerformed(evt); } }); kill.setText("Kill"); kill.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { killActionPerformed(evt); } }); table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "PID", "User", "CPU", "Memory", "Time", "Program" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane2.setViewportView(table); showAllUsers.setText("Show all users"); showRoot.setText("Show root processes"); jLabel2.setText("Update Speed:"); speed.setMajorTickSpacing(1); speed.setMaximum(11); speed.setMinimum(3); speed.setPaintTicks(true); speed.setSnapToTicks(true); speed.setValue(5); speed.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { speedStateChanged(evt); } }); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(terminate) .addComponent(jLabel2)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(kill) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(showAllUsers) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(showRoot)) .addComponent(speed, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 79, Short.MAX_VALUE))) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(terminate) .addComponent(kill) .addComponent(showAllUsers) .addComponent(showRoot)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel2) .addComponent(speed, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 507, Short.MAX_VALUE) .addContainerGap()) ); jTabbedPane1.addTab("Processes", jPanel1); jLabel1.setText("CPU"); jLabel3.setText("Memory"); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(resMemory, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(resCPU, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addComponent(jLabel3)) .addGap(0, 508, Short.MAX_VALUE))) .addContainerGap()) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(resCPU, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(resMemory, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(484, Short.MAX_VALUE)) ); jTabbedPane1.addTab("Resources", jPanel2); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1) ); }// </editor-fold>//GEN-END:initComponents private void terminateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_terminateActionPerformed int row = table.getSelectedRow(); if (row == -1) return; String pid = (String)table.getValueAt(row, 0); try { Runtime.getRuntime().exec(new String[] {"kill", "-15", pid}); } catch (Exception e) { JFLog.log(e); } }//GEN-LAST:event_terminateActionPerformed private void killActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killActionPerformed int row = table.getSelectedRow(); if (row == -1) return; String pid = (String)table.getValueAt(row, 0); try { Runtime.getRuntime().exec(new String[] {"kill", "-9", pid}); } catch (Exception e) { JFLog.log(e); } }//GEN-LAST:event_killActionPerformed private void speedStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_speedStateChanged restartTimer(); }//GEN-LAST:event_speedStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JButton kill; private javax.swing.JLabel resCPU; private javax.swing.JLabel resMemory; private javax.swing.JCheckBox showAllUsers; private javax.swing.JCheckBox showRoot; private javax.swing.JSlider speed; private javax.swing.JTable table; private javax.swing.JButton terminate; // End of variables declaration//GEN-END:variables private java.util.Timer timer; private void restartTimer() { if (timer != null) { timer.cancel(); timer = null; } int delay = speed.getValue(); if (delay == 11) return; timer = new java.util.Timer(); timer.schedule( new java.util.TimerTask() { public void run() { try { java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() { try { update(); } catch (Exception e1) { e1.printStackTrace(); } } }); } catch (Exception e2) {} } }, 100, delay * 1000); } private void update() { DefaultTableModel model = (DefaultTableModel)table.getModel(); ArrayList<Object[]> data = new ArrayList<Object[]>(); String pid = null; int row = table.getSelectedRow(); if (row != -1) { pid = (String)table.getValueAt(row, 0); } row = -1; boolean show_AllUsers = showAllUsers.isSelected(); boolean show_Root = showRoot.isSelected(); ShellProcess sp = new ShellProcess(); String output = sp.run(new String[] {"top", "-b", "-n", "1"}, false); String lns[] = output.split("\n"); String cuser = System.getenv("USER"); //0 = top ... //1 = Tasks ... //2 = Cpu(s) ... //3 = Mem ... //4 = Swap ... //5 = <blank> //6 = header //TODO : prettify this with some nice grafix resCPU.setText(lns[2]); resMemory.setText(lns[3]); for(int a=7;a<lns.length;a++) { String f[] = lns[a].trim().split(" +"); //greedy space if (f.length < 12) continue; //PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND String puser = f[1]; if (puser.equals("root")) { if (!show_Root) continue; } else if (!puser.equals(cuser)) { if (!show_AllUsers) continue; } if ((pid != null) && (f[0].equals(pid))) { row = data.size(); } //PID USER CPU MEM TIME PROGRAM data.add(new Object[] {f[0], f[1], f[8], f[4], f[10], f[11]}); } while (model.getRowCount() > 0) model.removeRow(0); int cnt = data.size(); for(int a=0;a<cnt;a++) { model.addRow(data.get(a)); } if (row != -1) { table.changeSelection(row, 0, false, false); table.scrollRectToVisible(table.getCellRect(row, 0, true)); } } }