package com.leanwo.management; import java.awt.BorderLayout; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.leanwo.management.model.ApplicationSetting; import com.leanwo.management.service.ProcessService; import com.leanwo.management.util.SpringUtil; import com.leanwo.management.util.Variable; import com.leanwo.management.widget.ColorCellRenderer; import com.leanwo.management.widget.SelectEventListener; import com.leanwo.management.widget.SelectObject; /** * 服务器管理界面 * * @author YangZhiJie * */ public class ServerFrame extends JPanel { private static Log logger = LogFactory.getLog(ServerFrame.class); private JTable table = null; private List settings = null; private DefaultTableModel tableModel = null; private Set listeners = null; private boolean isRunning = false; private ProcessService processService = null; private Timer timer = null; public ServerFrame(List settings) { this.settings = settings; initData(); initView(); } /** * 初始化 */ private void initData() { processService = (ProcessService) SpringUtil.getSingleBean(ProcessService.class); listeners = new HashSet(); tableModel = new DefaultTableModel(); Object[][] dataVector = null; if (settings != null && settings.size() > 0) { dataVector = new Object[settings.size()][6]; for (int i = 0; i < settings.size(); i++) { ApplicationSetting setting = settings.get(i); dataVector[i] = new Object[3]; dataVector[i][0] = String.valueOf(i + 1); dataVector[i][1] = setting.getName(); dataVector[i][2] = Variable.LOADING; } } Object[] columnIdentifiers = new Object[] { "序号", "程序", "状态" }; tableModel.setDataVector(dataVector, columnIdentifiers); } private void initView() { this.setLayout(new BorderLayout()); table = new JTable(tableModel); table.getColumn("序号").setPreferredWidth(50); table.getColumn("程序").setPreferredWidth(150); table.getColumn("状态").setPreferredWidth(90); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setRowSelectionAllowed(false); ListSelectionModel cellSelectionModel = table.getSelectionModel(); cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cellSelectionModel.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int[] selectedRows = table.getSelectedRows(); if (selectedRows.length > 0) { int selectedRow = selectedRows[0]; fireSelectEvent(selectedRow); } } }); //设置渲染器 ColorCellRenderer rcr = new ColorCellRenderer(); table.setDefaultRenderer(Object.class, rcr); JScrollPane scroll = new JScrollPane(table); add(scroll); timer = new Timer("定时器:定时更新服务器状态"); timer.schedule(timerTask, 2000L, 2000L); } /** * 添加选择事件 * * @param listener */ public void addStateChangeListener(SelectEventListener listener) { listeners.add(listener); } /** * 触发选择事件 * * @param selectedRow */ public void fireSelectEvent(int selectedRow) { SelectObject event = new SelectObject(table, selectedRow); if (listeners != null) { for (SelectEventListener selectEventListener : listeners) { selectEventListener.onSelect(event); } } } /** * 获取选中的行 * * @return */ public int getSelectedRow() { return table.getSelectedRow(); } /** * 更新表格 */ private void updateTable() { SwingUtilities.invokeLater(new Runnable() { public void run() { table.validate(); table.updateUI(); } }); } private TimerTask timerTask = new TimerTask() { @Override public void run() { if (isRunning) { logger.debug("上个定时程序还未运行完成,本次运行跳过"); return; } isRunning = true; int selectedRow = getSelectedRow(); if (settings != null && settings.size() > 0) { for (int i = 0; i < settings.size(); i++) { ApplicationSetting setting = settings.get(i); boolean oldStatus = setting.isOnline(); boolean online = false; try { online = processService.getStatus(setting); }catch(Exception ex) { logger.error(setting.getName() + "状态获取异常"); } setting.setOnline(online); String status = online ? Variable.RUNNING : Variable.NOT_RUNNING; final int tempI = i; table.setValueAt(status, tempI, 2); if (selectedRow == i) { if(oldStatus != online) { fireSelectEvent(selectedRow); } } } } isRunning = false; updateTable(); } }; }