package org.infosec.ismp.applet.manager.component.dialog; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.infosec.ismp.applet.manager.model.DomainModel; import org.infosec.ismp.applet.manager.model.NodeModel; import org.infosec.ismp.applet.manager.task.SaveDomainSensorTask; public class SensorAllotDialog extends JDialog{ private Map<DomainModel,List<NodeModel>> map = new HashMap<DomainModel,List<NodeModel>>(); private List<DomainModel> domain = new ArrayList<DomainModel>(); private List<NodeModel> pc = new ArrayList<NodeModel>(); private ButtonGroup group = new ButtonGroup(); private DefaultListModel radioModel = new DefaultListModel(); private DefaultListModel checkModel = new DefaultListModel(); private JButton btnEnter = new JButton("确定"); private JButton btnCancel = new JButton("取消"); protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); private boolean selectFlag = false; public static void main(String[] args) { SensorAllotDialog s = new SensorAllotDialog(); List<DomainModel> domain = new ArrayList<DomainModel>(); DomainModel d1 = new DomainModel(); d1.setName("1111"); DomainModel d2 = new DomainModel(); d2.setName("2222"); DomainModel d3 = new DomainModel(); d3.setName("3333"); domain.add(d1); domain.add(d2); domain.add(d3); List<NodeModel> node = new ArrayList<NodeModel>(); NodeModel n1 = new NodeModel(); n1.setName("aaaa"); NodeModel n2 = new NodeModel(); n2.setName("bbbb"); NodeModel n3 = new NodeModel(); n3.setName("cccc"); NodeModel n4 = new NodeModel(); n4.setName("dddd"); node.add(n1); node.add(n2); node.add(n3); node.add(n4); s.setDomainModel(domain); s.setSensorModel(node); } public SensorAllotDialog() { initGUI(); this.setTitle("PC分配域"); this.setLocationRelativeTo(null); } public void initGUI() { CheckBoxList checkBoxList = new CheckBoxList(); checkBoxList.setModel(checkModel); JScrollPane domainPanel = new JScrollPane(); domainPanel.setBorder(BorderFactory.createTitledBorder("域(部门)")); JScrollPane pcPanel = new JScrollPane(); pcPanel.setBorder(BorderFactory.createTitledBorder("PC设备")); final RadioButtonList radioButtonList = new RadioButtonList(); radioButtonList.setModel(radioModel); Container contaier = this.getContentPane(); contaier.setLayout(new BorderLayout()); domainPanel.getViewport().add(radioButtonList); pcPanel.getViewport().add(checkBoxList); JPanel midPanel = new JPanel(); midPanel.setLayout(new GridLayout(1,2)); midPanel.add(domainPanel); midPanel.add(pcPanel); JPanel buttonPanel = new JPanel(); buttonPanel.add(btnEnter); buttonPanel.add(btnCancel); contaier.add(midPanel,BorderLayout.CENTER); contaier.add(buttonPanel,BorderLayout.SOUTH); btnEnter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Set<DomainModel> set = map.keySet(); List<DomainModel> tempNodes = new ArrayList<DomainModel>(set); List<NodeModel> nodes = new ArrayList<NodeModel>(); for(DomainModel domain:tempNodes) { for(NodeModel node: map.get(domain)) { node.setParentDomain(domain); nodes.add(node); } } new SaveDomainSensorTask(nodes).execute(); SensorAllotDialog.this.dispose(); } }); btnEnter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SensorAllotDialog.this.dispose(); } }); radioButtonList.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { RadioButtonList list = (RadioButtonList)e.getSource(); JRadioButton radio = (JRadioButton)list.getSelectedValue(); DomainModel domain = (DomainModel)radio.getClientProperty(radio); checkModel.clear(); setSensorModel(pc); List<NodeModel> nodes = map.get(domain); for(NodeModel node:nodes) { JCheckBox checkBox = new JCheckBox(node.getName()); checkBox.putClientProperty(checkBox, node); checkBox.setSelected(true); checkModel.addElement(checkBox); } } }); checkBoxList.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { CheckBoxList list = (CheckBoxList)e.getSource(); JCheckBox check = (JCheckBox)list.getSelectedValue(); if(check == null || check.getClientProperty(check) == null) return; NodeModel node = (NodeModel)check.getClientProperty(check); DefaultListModel listModel = (DefaultListModel)radioButtonList.getModel(); JRadioButton selectRadio = null; for(Enumeration en = listModel.elements();en.hasMoreElements();) { JRadioButton radio = (JRadioButton)en.nextElement(); if(radio.isSelected()) { selectRadio = radio; } } if(selectRadio == null || selectRadio.getClientProperty(selectRadio) == null) return; DomainModel domain = (DomainModel)selectRadio.getClientProperty(selectRadio); if(selectFlag) { if(check.isSelected()) { pc.remove(node); List<NodeModel> nodes = map.get(domain); nodes.add(node); } else { pc.add(node); List<NodeModel> nodes = map.get(domain); nodes.remove(node); } } selectFlag = !selectFlag; } }); this.setSize(350, 300); this.setVisible(true); } public void setDomainModel(List<DomainModel> domians) { if(domians != null || domians.size() != 0) { this.domain = domians; for(DomainModel d:domians) { JRadioButton radioButton = new JRadioButton(d.getName()); radioButton.putClientProperty(radioButton, d); group.add(radioButton); radioModel.addElement(radioButton); map.put(d, new ArrayList<NodeModel>()); } if(radioModel.getSize() > 0) { ((JRadioButton)radioModel.get(0)).setSelected(true); } } } public void setSensorModel(List<NodeModel> pcs) { if(pcs != null || pcs.size() != 0) { this.pc = pcs; for(NodeModel p:pcs) { JCheckBox checkBox = new JCheckBox(p.getIpAddress()); checkBox.putClientProperty(checkBox, p); checkModel.addElement(checkBox); } } } class CheckBoxList extends JList { // protected static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); public CheckBoxList() { setCellRenderer(new CellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index != -1) { JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index); checkbox.setSelected( !checkbox.isSelected()); repaint(); } } } ); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } protected class CellRenderer implements ListCellRenderer { public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkbox = (JCheckBox) value; checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground()); checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground()); checkbox.setEnabled(isEnabled()); checkbox.setFont(getFont()); checkbox.setFocusPainted(false); checkbox.setBorderPainted(true); checkbox.setBorder(isSelected ? UIManager.getBorder( "List.focusCellHighlightBorder") : noFocusBorder); return checkbox; } } } class RadioButtonList extends JList { // protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); public RadioButtonList() { setCellRenderer(new CellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index != -1) { JRadioButton radioButton = (JRadioButton) getModel().getElementAt(index); radioButton.setSelected( !radioButton.isSelected()); repaint(); } } } ); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } protected class CellRenderer implements ListCellRenderer { public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JRadioButton radioButton = (JRadioButton) value; radioButton.setBackground(isSelected ? getSelectionBackground() : getBackground()); radioButton.setForeground(isSelected ? getSelectionForeground() : getForeground()); radioButton.setEnabled(isEnabled()); radioButton.setFont(getFont()); radioButton.setFocusPainted(false); radioButton.setBorderPainted(true); radioButton.setBorder(isSelected ? UIManager.getBorder( "List.focusCellHighlightBorder") : noFocusBorder); return radioButton; } } } }