import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.LineBorder; import java.util.HashMap; public class ListShip2 extends JPanel { private JList listStart, listShip, listDest; private MyListModel modelStart, modelShip, modelDest; private JButton sToShip, shipToS, shipToD, dToShip; private static final String addString = "Add"; private static final String removeString = "Remove"; private static Object[] result; private static final String prefix = "Status :"; private JLabel message; private String manOne, manTwo, manThree, womanOne, womanTwo, womanThree; public ListShip2() { super(new BorderLayout()); manOne = "man-Sugit"; manTwo = "man-Lee"; manThree = "man-Jagger"; womanOne = "woman-Pink"; womanTwo = "woman-Ann"; womanThree = "woman-Poona"; modelStart = new MyListModel(); modelStart.addElement(manOne); modelStart.addElement(womanOne); modelStart.addElement(manTwo); modelStart.addElement(womanTwo); modelStart.addElement(manThree); modelStart.addElement(womanThree); modelStart.addListDataListener(new MyListDataListener()); modelShip = new MyListModel(); modelShip.addListDataListener(new MyListDataListener()); modelDest = new MyListModel(); modelDest.addListDataListener(new MyListDataListener()); listStart = new JList(modelStart); listStart .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); listStart.setSelectedIndex(0); listStart.addListSelectionListener(new MyListSelectionListener()); listStart.setFixedCellWidth(100); listStart.setFixedCellHeight(15); listStart.setCellRenderer(new MyCellRenderer()); JScrollPane listStartScrollPane = new JScrollPane(listStart); listShip = new JList(modelShip); listShip .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); listShip.addListSelectionListener(new MyListSelectionListener()); listShip.setFixedCellWidth(100); listShip.setFixedCellHeight(15); listShip.setCellRenderer(new MyCellRenderer()); listShip.setBorder(new LineBorder(Color.BLUE, 1)); JScrollPane listShipScrollPane = new JScrollPane(listShip); listDest = new JList(modelDest); listDest .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); listDest.addListSelectionListener(new MyListSelectionListener()); listDest.setFixedCellWidth(100); listDest.setFixedCellHeight(15); listDest.setCellRenderer(new MyCellRenderer()); JScrollPane listDestScrollPane = new JScrollPane(listDest); sToShip = new JButton("Start to Ship->"); sToShip.setActionCommand(addString); sToShip.addActionListener(new AddButtonListener()); shipToS = new JButton("<-Ship to Start"); shipToS.setEnabled(false); shipToS.setActionCommand(removeString); shipToS.addActionListener(new RemoveButtonListener()); shipToD = new JButton("Ship to Dest->"); shipToD.setEnabled(false); shipToD.setActionCommand(removeString); shipToD.addActionListener(new RemoveButtonListener()); dToShip = new JButton("<-Dest to Ship"); dToShip.setEnabled(false); dToShip.setActionCommand(addString); dToShip.addActionListener(new AddButtonListener()); message = new JLabel(prefix); JPanel mPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); mPanel.add(message); JPanel buttonPane1 = new JPanel(new GridLayout(2, 1)); buttonPane1.add(sToShip); buttonPane1.add(shipToS); JPanel buttonPane2 = new JPanel(new GridLayout(2, 1)); buttonPane2.add(dToShip); buttonPane2.add(shipToD); JPanel bigPane = new JPanel(); bigPane.add(listStartScrollPane); bigPane.add(buttonPane1); bigPane.add(listShipScrollPane); bigPane.add(buttonPane2); bigPane.add(listDestScrollPane); add(bigPane, BorderLayout.CENTER); add(mPanel, BorderLayout.PAGE_END); } class MyCellRenderer extends DefaultListCellRenderer { public MyCellRenderer() { setOpaque(true); } private HashMap theChosen = new HashMap(); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (isSelected) { theChosen.put(value, "chosen"); } else { theChosen.remove(value); } setBackground(Color.white); if (theChosen.containsKey(value)) { setForeground(Color.red); } else { setForeground(Color.blue); } return this; } } class MyListDataListener implements ListDataListener { Object[] options = { "Yes again", "No I'm tired" }; public void contentsChanged(ListDataEvent e) { } public void intervalAdded(ListDataEvent e) { MyListModel lm = (MyListModel) e.getSource(); if (lm == modelStart) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkStart()) { showWarning(listStart); message.setText(prefix + "Break the rules on Start"); } } } else if (lm == modelShip) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkShip()) { showWarning(listShip); message.setText(prefix + "Break the rules on Ship"); } } if (modelShip.getSize() > 2) { showWarning(listShip); message.setText(prefix + "Ship can't load over 2 guys"); } } else if (lm == modelDest) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkDest()) { showWarning(listDest); message.setText(prefix + "Break the rules on Dest"); } } if (endsCondition()) { int way = JOptionPane.showOptionDialog(ListShip2.this, "Congratulation, You win!", "End of game", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (way == JOptionPane.YES_OPTION) { modelDest.clear(); modelStart.addElement(manOne); modelStart.addElement(womanOne); modelStart.addElement(manTwo); modelStart.addElement(womanTwo); modelStart.addElement(manThree); modelStart.addElement(womanThree); shipToD.setEnabled(false); sToShip.setEnabled(true); dToShip.setEnabled(false); revalidate(); repaint(); } else if (way == JOptionPane.NO_OPTION) { System.exit(0); } } } } public void intervalRemoved(ListDataEvent e) { MyListModel lm = (MyListModel) e.getSource(); if (lm == modelStart) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkStart()) { showWarning(listStart); message.setText(prefix + "Break the rules on Start"); } } } else if (lm == modelShip) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkShip()) { showWarning(listShip); message.setText(prefix + "Break the rules on Ship"); }else{ flowWarning(listShip); } } } else if (lm == modelDest) { if (checkLand()) { message.setText(prefix + "look good"); showPeaceful(); } else { if (!checkDest()) { showWarning(listDest); message.setText(prefix + "Break the rules on Dest"); } } } } } private boolean endsCondition() { boolean ends = false; if (modelDest.size() == 6) { ends = true; } return ends; } private void flowWarning(JList list) { list.setBorder(new LineBorder(Color.BLUE, 1)); } private void showPeaceful() { listStart.setBorder(new LineBorder(Color.BLUE, 1)); listShip.setBorder(new LineBorder(Color.BLUE, 1)); listDest.setBorder(new LineBorder(Color.BLUE, 1)); } private void showWarning(JList list) { Toolkit.getDefaultToolkit().beep(); list.setBorder(new LineBorder(Color.RED, 1)); } class MyListSelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { JComponent comp = (JComponent) e.getSource(); if (comp == listStart) { if (!getSelectionList(e, listStart)) Toolkit.getDefaultToolkit().beep(); } else if (comp == listShip) { if (!getSelectionList(e, listShip)) Toolkit.getDefaultToolkit().beep(); } else if (comp == listDest) { if (!getSelectionList(e, listDest)) Toolkit.getDefaultToolkit().beep(); } } } private boolean getSelectionList(ListSelectionEvent e, JList list) { ListSelectionModel lsm = list.getSelectionModel(); boolean selectOK = false; int firstSelected = lsm.getMinSelectionIndex(); int lastSelected = lsm.getMaxSelectionIndex(); if ((lastSelected - firstSelected)<=1) { message.setText(prefix + "Select at most 2 guys"); selectOK = true; }else if(((lastSelected - firstSelected) > 1)){ if (((list.isSelectedIndex(firstSelected+1))&& (lastSelected!=(firstSelected+1))) || ((list.isSelectedIndex(firstSelected+2))&& (lastSelected!=(firstSelected+2))) ){ message.setText(prefix + "Cant select over 2 guys"); selectOK = false; }else if(((list.isSelectedIndex(lastSelected-1))&& (firstSelected!=(lastSelected-1))) || ((list.isSelectedIndex(firstSelected-2))&& (firstSelected!=(lastSelected-2))) ){ message.setText(prefix + "Cant select over 2 guys"); selectOK = false; } else { message.setText(prefix + "Select at most 2 guys"); selectOK = true; } } return selectOK; } class AddButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JComponent comp = (JComponent) e.getSource(); if (comp == sToShip) { result = listStart.getSelectedValues(); modelStart.removeArrayElement(result); modelShip.addArrayElement(result); if (checkLand()) { sToShip.setEnabled(false); shipToD.setEnabled(true); } else { shipToS.setEnabled(true); } } else if (comp == dToShip) { result = listDest.getSelectedValues(); modelDest.removeArrayElement(result); modelShip.addArrayElement(result); if (checkLand()) { dToShip.setEnabled(false); shipToS.setEnabled(true); } else { shipToD.setEnabled(true); } } } } class RemoveButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JComponent comp = (JComponent) e.getSource(); if (comp == shipToS) { result = listShip.getSelectedValues(); modelShip.removeArrayElement(result); modelStart.addArrayElement(result); shipToD.setEnabled(false); sToShip.setEnabled(true); if (modelShip.size() == 0) { shipToS.setEnabled(false); } } else if (comp == shipToD) { result = listShip.getSelectedValues(); modelShip.removeArrayElement(result); modelDest.addArrayElement(result); shipToS.setEnabled(false); dToShip.setEnabled(true); if (modelShip.size() == 0) { shipToD.setEnabled(false); } } } } private boolean checkLand() { return checkStart() && checkDest() && checkShip(); } private boolean checkStart() { boolean nbeep = true; if ((modelStart.contains(womanOne) && (modelStart.contains(manTwo) || (modelStart .contains(manThree)))) && (!modelStart.contains(manOne))) { nbeep = false; } if ((modelStart.contains(womanTwo) && (modelStart.contains(manOne) || (modelStart .contains(manThree)))) && (!modelStart.contains(manTwo))) { nbeep = false; } if ((modelStart.contains(womanThree) && (modelStart.contains(manOne) || (modelStart .contains(manTwo)))) && (!modelStart.contains(manThree))) { nbeep = false; } return nbeep; } private boolean checkShip() { boolean nbeep = true; if ((modelDest.contains(womanOne) && (modelDest.contains(manTwo) || (modelDest .contains(manThree)))) && (!modelDest.contains(manOne))) { nbeep = false; } if ((modelDest.contains(womanTwo) && (modelDest.contains(manOne) || (modelDest .contains(manThree)))) && (!modelDest.contains(manTwo))) { nbeep = false; } if ((modelDest.contains(womanThree) && (modelDest.contains(manOne) || (modelDest .contains(manTwo)))) && (!modelDest.contains(manThree))) { nbeep = false; } return nbeep; } private boolean checkDest() { boolean nbeep = true; if ((modelDest.contains(womanOne) && (modelDest.contains(manTwo) || (modelDest .contains(manThree)))) && (!modelDest.contains(manOne))) { nbeep = false; } if ((modelDest.contains(womanTwo) && (modelDest.contains(manOne) || (modelDest .contains(manThree)))) && (!modelDest.contains(manTwo))) { nbeep = false; } if ((modelDest.contains(womanThree) && (modelDest.contains(manOne) || (modelDest .contains(manTwo)))) && (!modelDest.contains(manThree))) { nbeep = false; } return nbeep; } class MyListModel extends DefaultListModel { public void removeArrayElement(Object[] temp) { for (int i = 0; i < temp.length; i++) { if (temp[i] != null) { removeElement(temp[i]); } } } public void addArrayElement(Object[] temp) { for (int i = 0; i < temp.length; i++) { if (temp[i] != null) { addElement(temp[i]); } } } } private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("ListShip"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. JComponent newContentPane = new ListShip2(); newContentPane.setOpaque(true); // content panes must be opaque frame.setContentPane(newContentPane); // Don't let the content pane get too small. // (Works if the Java look and feel provides // the window decorations.) newContentPane.setMinimumSize(new Dimension(newContentPane .getPreferredSize().width, 100)); // Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }