Java tutorial
package anl.verdi.gis; import gov.epa.emvl.MapLines; import java.awt.BorderLayout; import java.awt.Component; 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.HashMap; import java.util.List; import java.util.Map; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.Timer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.logging.log4j.LogManager; // 2014 import org.apache.logging.log4j.Logger; // 2014 replacing System.out.println with logger messages import org.geotools.map.FeatureLayer; //import org.geotools.map.MapLayer; // GeoTools deprecated the MapLayer class; need to use FeatureLayer, GridCoverageLayer, or GridReaderLayer import com.jgoodies.forms.factories.FormFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpec; import com.jgoodies.forms.layout.RowSpec; import com.jgoodies.forms.layout.Sizes; /** * @author IE, UNC at Chapel Hill */ public class FastTileLayerPanel extends JPanel { private static final long serialVersionUID = -1216281930499819824L; static final Logger Logger = LogManager.getLogger(FastTileLayerPanel.class.getName()); private List<MapLines> removeLayers = new ArrayList<MapLines>(); private List<MapLines> addLayers = new ArrayList<MapLines>(); private List<MapLines> layers; private Map<MapLines, LayerMove> layerMoves = new HashMap<MapLines, LayerMove>(); private FeatureLayer controlLayer; enum MoveType { UP, DOWN } // identity is based on the layer, // as we only want a single LayerMove in the set // per layer. private class LayerMove { MapLines layer; int newIndex; MoveType type; // NOTE: assigned, passed in value, but does not appear to be used public LayerMove(MapLines layer, int newIndex, MoveType type) { this.layer = layer; this.newIndex = newIndex; this.type = type; } public boolean equals(Object obj) { if (obj instanceof LayerMove) { return layer.equals(((LayerMove) obj).layer); } return false; } public int hashCode() { return layer.hashCode(); } } private class LayerListRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = -3655313193399647298L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); MapLines layer = (MapLines) value; label.setText(layer.getMapFile()); return label; } } private class ButtonClickRepeater extends MouseAdapter implements ActionListener { private Timer autoRepeatTimer; private JButton button; public ButtonClickRepeater(JButton button) { this.button = button; autoRepeatTimer = new javax.swing.Timer(100, this); autoRepeatTimer.setInitialDelay(300); } @Override public void mousePressed(MouseEvent e) { autoRepeatTimer.start(); } @Override public void mouseReleased(MouseEvent e) { autoRepeatTimer.stop(); } public void actionPerformed(ActionEvent e) { e.setSource(button); if (button.isEnabled()) { for (ActionListener listener : button.getActionListeners()) { listener.actionPerformed(e); } } } } public FastTileLayerPanel() { initComponents(); DefaultListModel model = new DefaultListModel(); layerList.setModel(model); layerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); moveUpButton.addMouseListener(new ButtonClickRepeater(moveUpButton)); moveDownButton.addMouseListener(new ButtonClickRepeater(moveDownButton)); } private void removeLayerButtonActionPerformed(ActionEvent e) { // Object[] selected = layerList.getSelectedValues(); // JList getSelectedValues is now GetSelectedValuesList and returns List<> List selected = layerList.getSelectedValuesList(); for (Object select : selected) { removeLayers.add((MapLines) select); ((DefaultListModel) layerList.getModel()).removeElement(select); } } // private void addBtnActionPerformed(ActionEvent e) { // FastTileAddLayerWizard wizard = new FastTileAddLayerWizard(); // wizard.setControlLayer(controlLayer); // JDialog dialog = (JDialog)SwingUtilities.getWindowAncestor(this); // MapLines layer = wizard.display((JFrame)dialog.getParent(), false); // // if (layer != null) { // ((DefaultListModel) layerList.getModel()).add(0, layer); // addLayers.add(layer); // layerList.setSelectedIndex(0); // layerList.scrollRectToVisible(layerList.getCellBounds(0, 0)); // } // } // private void editLayerButtonPerformed(ActionEvent e) { // Logger.debug("in FastTileLayerPlot.editLayerButtonPerformed"); // MapLines selected = (MapLines)layerList.getSelectedValue(); // int index = layerList.getSelectedIndex(); // Logger.debug("got index = " + index); // if (selected == null) // return; // Logger.debug("selected is not null"); // if (controlLayer != null && selected.getStyle() != null) // { // controlLayer.setStyle(selected.getStyle()); //\ Logger.debug("just set selected style"); // } // // Logger.debug("ready to instantiate mapFile"); // File mapFile = new File(selected.getMapFile()); // Logger.debug("ready to instantiate FastTileAddLayerWizard"); // FastTileAddLayerWizard wizard = new FastTileAddLayerWizard(mapFile, controlLayer, selected, false); // Logger.debug("ready to start dialog"); // JDialog dialog = (JDialog)SwingUtilities.getWindowAncestor(this); // Logger.debug("ready to display wizard"); // MapLines layer = wizard.display((JFrame)dialog.getParent(), true); // Logger.debug("have a layer - ready to check it out"); // if (layer != null && !selected.equals(layer)) { // Logger.debug("ready to deal with layers"); // ((DefaultListModel) layerList.getModel()).remove(index); // ((DefaultListModel) layerList.getModel()).add(index, layer); // layers.remove(selected); // addLayers.remove(selected); // layerMoves.remove(selected); // removeLayers.add(selected); // addLayers.add(layer); // layerList.setSelectedIndex(index); // layerList.scrollRectToVisible(layerList.getCellBounds(index, index)); // Logger.debug("done dealing with layers, ready to return from FastTileLayerPlot.editLayerButtonPerformed"); // return; // } // Logger.debug("returning without dealing with layers, from FastTileLayerPlot.editLayerButtonPerformed"); // } public void setContext(List<MapLines> layers) { this.layers = layers; DefaultListModel model = new DefaultListModel(); for (MapLines layer : layers) { model.addElement(layer); } layerList.setModel(model); layerList.setCellRenderer(new LayerListRenderer()); } private void moveUpButtonActionPerformed(ActionEvent e) { Object selected = layerList.getSelectedValue(); MapLines layer = (MapLines) selected; LayerMove move = layerMoves.get(layer); if (move == null) { int oldIndex = 0; int addIndex = addLayers.indexOf(layer); if (addIndex > -1) { oldIndex = layers.size() + addIndex; } else { oldIndex = layers.indexOf(layer); } move = new LayerMove(layer, oldIndex + 1, MoveType.UP); layerMoves.put(layer, move); } else { move.newIndex++; } int index = layerList.getSelectedIndex(); DefaultListModel tModel = (DefaultListModel) layerList.getModel(); Object obj = tModel.remove(index); int index1 = index - 1; tModel.add(index1, obj); layerList.setSelectedIndex(index1); layerList.scrollRectToVisible(layerList.getCellBounds(index1, index1)); } private void moveDownButtonActionPerformed(ActionEvent e) { Object selected = layerList.getSelectedValue(); MapLines layer = (MapLines) selected; LayerMove move = layerMoves.get(layer); if (move == null) { int oldIndex = 0; int addIndex = addLayers.indexOf(layer); if (addIndex > -1) { oldIndex = layers.size() + addIndex; } else { oldIndex = layers.indexOf(layer); } move = new LayerMove(layer, oldIndex - 1, MoveType.UP); layerMoves.put(layer, move); } else { move.newIndex--; } int index = layerList.getSelectedIndex(); DefaultListModel tModel = (DefaultListModel) layerList.getModel(); Object obj = tModel.remove(index); int index1 = index + 1; tModel.add(index1, obj); layerList.setSelectedIndex(index1); layerList.scrollRectToVisible(layerList.getCellBounds(index1, index1)); } public void commit() { for (MapLines item : removeLayers) { if (layers.contains(item)) layers.remove(item); } DefaultListModel model = (DefaultListModel) layerList.getModel(); int size = model.getSize(); for (int i = 0; i < size; i++) { MapLines obj = (MapLines) model.getElementAt(i); int index = layers.indexOf(obj); if (index != -1) layers.remove(index); layers.add(i, obj); } } private void layerListValueChanged(ListSelectionEvent e) { // if (layerList.getSelectedValue() != null) // editLayerButton.setEnabled(true); // if (layerList.isSelectionEmpty()) // editLayerButton.setEnabled(false); if (layerList.getSelectedIndex() == 0) { moveUpButton.setEnabled(false); } else { moveUpButton.setEnabled(true); } if (layerList.getSelectedIndex() == layerList.getModel().getSize() - 1) { moveDownButton.setEnabled(false); } else { moveDownButton.setEnabled(true); } } public void setControlLayer(FeatureLayer layer) { this.controlLayer = layer; } private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY // //GEN-BEGIN:initComponents // Generated using JFormDesigner non-commercial license scrollPane1 = new JScrollPane(); layerList = new JList(); // addBtn = new JButton(); moveUpButton = new JButton(); moveDownButton = new JButton(); removeLayerButton = new JButton(); // editLayerButton = new JButton(); CellConstraints cc = new CellConstraints(); //======== this ======== // 2014 ColumnSpec aColumnSpec = new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW); RowSpec aRowSpec = new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW); RowSpec bRowSpec = new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW); setLayout(new FormLayout( new ColumnSpec[] { aColumnSpec, FormFactory.LABEL_COMPONENT_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC }, new RowSpec[] { aRowSpec, FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.LINE_GAP_ROWSPEC, bRowSpec })); // setLayout(new FormLayout( // new ColumnSpec[]{ // new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW), // FormFactory.LABEL_COMPONENT_GAP_COLSPEC, // FormFactory.DEFAULT_COLSPEC // }, // new RowSpec[]{ // new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW), // FormFactory.LINE_GAP_ROWSPEC, // FormFactory.DEFAULT_ROWSPEC, // FormFactory.LINE_GAP_ROWSPEC, // FormFactory.DEFAULT_ROWSPEC, // FormFactory.LINE_GAP_ROWSPEC, // FormFactory.DEFAULT_ROWSPEC, // FormFactory.LINE_GAP_ROWSPEC, // FormFactory.DEFAULT_ROWSPEC, // FormFactory.LINE_GAP_ROWSPEC, // FormFactory.DEFAULT_ROWSPEC, // FormFactory.LINE_GAP_ROWSPEC, // new RowSpec(RowSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW) // })); //======== scrollPane1 ======== { //---- layerList ---- layerList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { layerListValueChanged(e); } }); scrollPane1.setViewportView(layerList); } add(scrollPane1, cc.xywh(1, 1, 1, 13)); //---- addBtn ---- // addBtn.setText("Add Layer"); // 2014 removed button to avoid problems with Simphony // addBtn.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // addBtnActionPerformed(e); // } // }); // add(addBtn, cc.xy(3, 3)); //---- moveUpButton ---- moveUpButton.setText("Move Up"); moveUpButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { moveUpButtonActionPerformed(e); } }); add(moveUpButton, cc.xy(3, 5)); //---- moveDownButton ---- moveDownButton.setText("Move Down"); moveDownButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { moveDownButtonActionPerformed(e); } }); add(moveDownButton, cc.xy(3, 7)); //---- removeLayerButton ---- removeLayerButton.setText("Remove Layer"); removeLayerButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { removeLayerButtonActionPerformed(e); } }); add(removeLayerButton, cc.xy(3, 9)); //---- editLayerButton ---- // 2014 removed Edit Layer button from interface - causes crash by Simphony // editLayerButton.setText("Edit Layer"); // editLayerButton.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // editLayerButtonPerformed(e); // } // }); // add(editLayerButton, cc.xy(3, 11)); // editLayerButton.setEnabled(false); // //GEN-END:initComponents } // JFormDesigner - Variables declaration - DO NOT MODIFY // //GEN-BEGIN:variables // Generated using JFormDesigner non-commercial license private JScrollPane scrollPane1; private JList layerList; // private JButton addBtn; private JButton moveUpButton; private JButton moveDownButton; private JButton removeLayerButton; // private JButton editLayerButton; // JFormDesigner - End of variables declaration //GEN-END:variables public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.setSize(500, 500); frame.add(new FastTileLayerPanel(), BorderLayout.CENTER); frame.setVisible(true); } }