Jump to content


Photo

คุณเคนอิจิ คุณphoosana คิดว่า class swing ผมเป็นไงบ้าง ช่วยวิจารณ์หน่อย


  • Please log in to reply
23 ความเห็นในกระทู้นี้

#1 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 20 มีนาคม พ.ศ. 2556 - 13:26

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();
			}
		});
	}

}

 


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#2 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 20 มีนาคม พ.ศ. 2556 - 13:32

แหะ ๆ แบบยาวมาก ๆ ผมงี้ตาลายเลย ช่วยนำไป run แล้ว วิจารณ์หน่อยครับ

 

พยายามเต็มที่แล้วได้แค่นี้ ล่ะครับ

 

คือ เรื่องของเรื่องมาจากเกม พายเรือ ข้ามฟาก น่ะครับ

 

กฏคือ

 

1. มีชาย หญิง อยู่ 3 คู่ คู่แรก ชาย-สุกิต หญิง-พิงค์ เป็นแฟนกัน คู่ที่สอง ชาย-ลี หญิง-แอน เป็นแฟนกัน คู่ที่สาม ชาย-jagger หญิง-ปูนา เป็นแฟนกัน

 

2. ห้ามให้ หญิงของตน ไปอยู่ในเรือ(JList ตรงกลาง) หรือ ฝั่งใดฝั่งหนึ่ง โดยที่ไม่มี ชาย(สามี) ไปด้วย

 

3.ไปเรือ ได้ครั้งละ ไม่เกิน 2 คน ถ้า คนเดียวได้

 

4. ไปอีกฝั่ง ให้ครบทุกคน ครับ


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#3 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 20 มีนาคม พ.ศ. 2556 - 13:36

เอ้อ ลืมบอกไปครับ วิธีใช้ mouse ในการ เลือก element ใน JList

 

ถ้าเลือก คนเดียว ก็ กด คลิกที่ชื่อ

 

ถ้าเลือก สองคน แบบติด ก็คลิกที่คนใดคนหนึ่ง แล้ว กด shift ค้างไว้ แล้วใช้ mouse drag หรือ ใช้ลูกศร ขึ้นลง ก็ได้ครับ

 

ถ้าเลือก สองคน แบบไม่ติด ก็คลิกที่คนใดคนหนึ่ง แล้ว กด control ค้างไว้(เป็นการคงสถานะการเลือกคนแรก) แล้วใช้ mouse คลิกไปที่ชื่อ อีกคนครับ

 

บางที ถึงเลือกถูกแล้ว แต่ยังมี เสียง beep จาก toolkit

 

ไม่ต้องแปลกใจนะครับ เพราะ method intervalAdd ใน class MyDataListener มันตรวจสอบ ทุก element ที่ ถูก add เข้ามาเลย

 

แล้วผมไม่สามารถทำให้ element ตั้งแต่สอง ขึ้นไป เคลื่อนย้าย ไปพร้อมกันได้ครับ (เป็นข้อจำกัด ของ method)


Edited by ทรงธรรม, 20 มีนาคม พ.ศ. 2556 - 13:39.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#4 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 20 มีนาคม พ.ศ. 2556 - 13:43

แหะ ๆ สอง method สุดท้าย ผมลอกจาก swing gui ของ oracle เค้าแหละครับ

 

ไม่ได้คิดเอง หรอก รวมถึง class ที่ extends มาจาก DefaultListRenderer ด้วย แหะ ๆ


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#5 IFai

IFai

    รักในหลวง

  • Members
  • PipPipPipPipPip
  • 5,782 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 04:32

 เขียนโปรแกรมเกมส์ หรือครับ ...เหมือนเกมส์ฝึกสมองเลย

 นึกถึงตอนเขียนระบบ สินค้าคงคลัง ด้วยดีเบส


ประโยชน์สูงสุดของประชาชน คือกฏหมายสูงสุดของประเทศ ...วิชา มหาคุณ


#6 เคนอิจิ-นามิ

เคนอิจิ-นามิ

    สมาชิกขั้นสูง

  • Banned
  • PipPipPipPip
  • 4,447 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 09:46

จะให้ดูอะไรหรือครับ
ผมไม่มีเครื่องให้รัน ตอนนี้ใช้แต่มือถือ

ถ้ารันได้ก็ดีแล้วครับ ยินดีด้วย
ฐานต่อไป ให้ลองฝึกแยกชิ้นส่วนงานตัวเองดู

สมมุติว่า ไปดูตัวอย่างมาแล้วหลายเกมส์
ก็แยกชิ้นแต่ละเมตอท ว่า จะเอาแต่ละส่วนไปใช้ทำอะไรได้อีก

เริ่มแรกยังไม่ต้องให้มันฉลาดมาก
ให้มันเดินเล่นไปมา ก็พอ
แล้วค่อยเริ่มทำให้มันคิดเองได้ทีหลัง

ตรรกของผมที่แตกต่างจากสมาชิกคนอื่นใน สรท นิ๊ดเดียว  :D http://webboard.seri...e-3#entry634878

รอแมงวันหน้าสันขวานดิ้นดุ๊กดิ้กมาขอขมาอยู่นะ http://webboard.seri...-แวร์/?p=609037

ความตอแหลขอไอ้แมงวัน  http://webboard.seri...-แวร์/?p=609177

 


#7 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 10:08

จะให้ดูอะไรหรือครับ
ผมไม่มีเครื่องให้รัน ตอนนี้ใช้แต่มือถือ

ถ้ารันได้ก็ดีแล้วครับ ยินดีด้วย
ฐานต่อไป ให้ลองฝึกแยกชิ้นส่วนงานตัวเองดู

สมมุติว่า ไปดูตัวอย่างมาแล้วหลายเกมส์
ก็แยกชิ้นแต่ละเมตอท ว่า จะเอาแต่ละส่วนไปใช้ทำอะไรได้อีก

เริ่มแรกยังไม่ต้องให้มันฉลาดมาก
ให้มันเดินเล่นไปมา ก็พอ
แล้วค่อยเริ่มทำให้มันคิดเองได้ทีหลัง

แหะ ๆ ไม่ใช่ เกม ที่มี การเคลื่อนไหว ของ ภาพ หรอกครับ

 

ผมยังไม่ได้เรียน เรื่อง 2d graphics เลย แต่ เสาร์ อาทิตย์ นี้ น่าจะได้เริ่มอ่านบ้างแล้ว

 

คือ class นี้ เป็นการใช้ graphic user interface ที่มี component จำพวก

 

button , list , label , table , tree , menubar , scroll bar แบบนี้ เป็นต้นน่ะครับ

 

เพียงแต่ ผมนำมาใช้กับเกม พายเรือ ข้ามฟาก เพราะผม จำเกมนี้ ได้แม่น มาจาก คำถาม ตรรกะ ที่ ผมชอบอ่านน่ะครับ

 

เลยลองใช้ list 3 อัน แทน จุดเริ่มต้น ,เรือ และ จุดเป้าหมาย น่ะครับ

 

และใช้ button ในการเคลื่อนย้าย element ที่แทนชื่อคน ใน list ไปสู่ list อื่น น่ะครับ


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#8 เคนอิจิ-นามิ

เคนอิจิ-นามิ

    สมาชิกขั้นสูง

  • Banned
  • PipPipPipPip
  • 4,447 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 12:36

ทำได้ ทั้งหมดนั้นก็เจ๋งแล้วฮะ
ว่างๆ แปะรูปมาให้ดูสิ แล้วอธิบาย
จะช่วยสร้างทักษะการเขียน
ซึ่งส่งผลกับ design ของแอพอื่นๆที่เราจะทำต่อไป

ตรรกของผมที่แตกต่างจากสมาชิกคนอื่นใน สรท นิ๊ดเดียว  :D http://webboard.seri...e-3#entry634878

รอแมงวันหน้าสันขวานดิ้นดุ๊กดิ้กมาขอขมาอยู่นะ http://webboard.seri...-แวร์/?p=609037

ความตอแหลขอไอ้แมงวัน  http://webboard.seri...-แวร์/?p=609177

 


#9 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 13:09

ทำได้ ทั้งหมดนั้นก็เจ๋งแล้วฮะ
ว่างๆ แปะรูปมาให้ดูสิ แล้วอธิบาย
จะช่วยสร้างทักษะการเขียน
ซึ่งส่งผลกับ design ของแอพอื่นๆที่เราจะทำต่อไป

พูดถึง แปะรูป คุณเคนอิจิ ผมแปะรูป ไม่ได้เลย มันขึ้น error ตลอดเลย  (ไม่รู้เป็นที่ ohozaa หรือ เป็นที่ ผมใช้งานไม่เป็น )

 

ผมอยากแปะรูป อะ ผมจะได้ถาม ปัญหา คุณ เคนอิจิ ได้ง่าย ๆ หน่อย

 

เวลาผม run แล้วมันไม่ขึ้นอย่างที่ตั้งใจ


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#10 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 13:24

ขนาดรูปใหญ่เกินหรือเปล่า :lol:

Attached Images

  • 21-3-2556 13-38-26.jpg

Edited by phoosana, 21 มีนาคม พ.ศ. 2556 - 13:40.

We love fender.

#11 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 13:48

ใช้ได้ครับ พัฒนาไปเยอะ ไม่มีอะไรวิจารณ์ ผมลองเล่นแบบไม่สนใจเงื่อนไขมั่วไปๆ ให้ผ่าน ฮ่าๆๆ


We love fender.

#12 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 17:41

เหมือนโปรมแกรมยังทำงานไม่ครอบคลุม ผมสามารถพาทั้งหกคนลงเรือข้ามในเที่ยวเดียวได้
ลองดูว่าพลาดตรงไหน น่าจะป้องกันไม่ให้มีการแหกกฏ ถึงมีเสียงและข้อความเตือน
ไม่ควรให้ทำต่อได้

Edited by phoosana, 21 มีนาคม พ.ศ. 2556 - 17:55.

We love fender.

#13 เคนอิจิ-นามิ

เคนอิจิ-นามิ

    สมาชิกขั้นสูง

  • Banned
  • PipPipPipPip
  • 4,447 posts

ตอบ 21 มีนาคม พ.ศ. 2556 - 21:24

ลองเขียน algorithm ออกมาดูไหม?
จะได้ทดสอบความเข้าใจตัวเอง แล้วเผื่อจะได้ชี้คุยกันได้ตรงจุดนะครับ
ตรงจุดที่วาด object ไม่ต้องนะครับ เอาส่วนทำงานของเกมส์เท่านั้น เช่น

(ถ้าผมอ่านผิด ช่วยแก้ด้วย)

1. สร้าง ลิสท์ (ชื่อ)
1.1 ใส่ชื่อ 6 คนลงไป
2. สร้างอีก 2ลิสท์ เป็นลิสท์ว่าง
3. เมื่อกดปุ่ม (ชื่อ)
3.1 เช็คลิสท์ 1
3.1.1 ถ้า contain(หญิง1 && ชาย 1) || contain () return true else return false
3.1.1 ถ้า contain(หญิง2 && ชาย 2) || contain () return true else return false
3.1.1 ถ้า contain(หญิง3 && ชาย 3) || contain () return true else return false
3.2 เช็คลิสท์ 2
....
3.3 เช็คลิสท์ 3
....
4. ถ้า 3 return false ส่งแมสเสจ "ผิดกฏ พยายามใหม่"
4.1 .... disable ปุ่ม
4.2 clear ค่า ....
5. ถ้า 3 return true

แบบนี้อะคับ จะทำให้ดูโค้ดง่ายขึ้นอ่า...
:)

ลอกมาแบบนี้แหละถูกแล้ว ผมก็ลอกหนังสือ สมัยเรื่มต้นเขียนเหมือนกัน
แต่หลังจากนั้น เราต้องทำความเข้าใจ ในทุกๆ statement ด้วยครับ
ถ้าแบบนี้ ถึงจะเจอจุดบักส์ได้ง่าย
และ แก้ไข logic ให้รัดกุมขึ้นได้ครับ

ตรรกของผมที่แตกต่างจากสมาชิกคนอื่นใน สรท นิ๊ดเดียว  :D http://webboard.seri...e-3#entry634878

รอแมงวันหน้าสันขวานดิ้นดุ๊กดิ้กมาขอขมาอยู่นะ http://webboard.seri...-แวร์/?p=609037

ความตอแหลขอไอ้แมงวัน  http://webboard.seri...-แวร์/?p=609177

 


#14 RiDKuN_user

RiDKuN_user

    มหาเมพ

  • Members
  • PipPipPipPipPipPipPip
  • 13,167 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 02:29

ตรงๆ คือเยิ่นเย้อเกินไปครับ ควรจะปรับปรุงให้กระชับและชัดเจนกว่านี้

ชื่อ function ควรจะสื่อความหมาย และไม่รับ parameter ที่ไม่ได้ใช้งาน

เวลาทำงานซ้ำๆ ควรใช้ array, loop และ function ในการเขียน

ไม่ใช่ทำ 6 ทีก็ก้อปแปะ 6 รอบครับ จงจำไว้ว่า code ที่ดีคือ code ที่สั้นพอประมาณ 

เพราะย่อจนสั้นไปก็อ่านไม่รู้เรื่อง หรือเขียนจนยาวไปก็อ่านไม่รู้เรื่องเหมือนกันครับ  -_-


" ชีวิตผมไม่เคยกลัวอะไรทั้งนั้น ผมกลัวอย่างเดียว...กลัวจะถูกมองว่า 'ขายชาติ' " - The Last Tycoon

~ ทักษิณตาย เสรีไทยไชโย ~

#15 ผึ้งน้อยตุหรัดตุเหร่

ผึ้งน้อยตุหรัดตุเหร่

    หน้าตาดี มีอุดมการณ์

  • Members
  • PipPipPipPipPipPipPip
  • 21,670 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 02:43

เข้ามาเอาใจช่วย

 

 

ทุกท่านน่ารักมาก :wub:


gladiator 1.jpg

 

 

 

 

 

 


#16 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 07:02

ตรงๆ คือเยิ่นเย้อเกินไปครับ ควรจะปรับปรุงให้กระชับและชัดเจนกว่านี้

ชื่อ function ควรจะสื่อความหมาย และไม่รับ parameter ที่ไม่ได้ใช้งาน

เวลาทำงานซ้ำๆ ควรใช้ array, loop และ function ในการเขียน

ไม่ใช่ทำ 6 ทีก็ก้อปแปะ 6 รอบครับ จงจำไว้ว่า code ที่ดีคือ code ที่สั้นพอประมาณ 

เพราะย่อจนสั้นไปก็อ่านไม่รู้เรื่อง หรือเขียนจนยาวไปก็อ่านไม่รู้เรื่องเหมือนกันครับ  -_-

ขอบคุณ ทุกความเห็น นะครับ

 

โดยเฉพาะ อันนี้ เห็นจริง ตามนั้นเลยครับ

 

ถ้าให้ผมมาอ่าน code ตัวเองทีหลัง อาจไม่เข้าใจว่า function นี้ ใช้ทำอะไรก็ได้

 

ยอมรับ ว่าตอนสร้าง method มั่วตั้งชื่อ แบบส่ง ๆ เลยครับ ทีหลัง ผมต้องเปิด dic แล้ว เลือก ศัพท์ที่ลงตัวครับ(ผมไม่เก่งภาษา อะครับ)

 

ส่วนเรื่อง code ซ้ำ ก็ยอมรับ เลยครับ ว่าซ้ำจริง หลายจุดด้วย

 

เดี๋ยวผม ปิดงบ เสร็จแล้ว ผมจะลองมาแก้ไข ให้มัน ไปรวม กับ method ใด method หนึ่ง ที่รับกันได้ครับ

 

คือ ผมมันประเภท เขียน code แบบ ใจร้อนไปหน่อย เออ ตรงไหนใส่ได้ ก็ใส่ไปเลย

 

แล้วแบบ พอ run ได้ ก็เลยไม่ไปสนใจแก้ไขมันเลย แต่ถ้ามาอ่านอีกรอบ ก็เห็นจริง ตามนั้นเลยครับ


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#17 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 07:20

เหมือนโปรมแกรมยังทำงานไม่ครอบคลุม ผมสามารถพาทั้งหกคนลงเรือข้ามในเที่ยวเดียวได้
ลองดูว่าพลาดตรงไหน น่าจะป้องกันไม่ให้มีการแหกกฏ ถึงมีเสียงและข้อความเตือน
ไม่ควรให้ทำต่อได้

เห็นด้วย อีกครับ

 

แล้วจะบอกว่า ผมคิดว่า มันยากมากครับ ที่จะทำได้

 

แต่ไม่ใช่ว่า ทำไม่ได้ เพียงแต่ ผมต้อง ใช้ความพยายาม ในการ search หาวิธีจาก google ให้มากขึ้น

 

ทุกครั้งในการเขียน code แต่ละ class ผมต้อง search ตลอดอะครับ

 

 

เพราะสิ่งที่เราคิด บางที เรายังไม่ได้วิธีการ ก็เลยต้อง ไป search หา ไอเดีย จากคนอื่น

 

ขนาด code ที่ไม่สมบูรณ์นี้ ผมยังใช้เวลาตั้ง 15 ชม. แน่ะครับ

 

 

จริง ๆ ผมคิดมากเลยนะครับ ที่จะ block ไม่ให้ใส่คนในเรือ ลงไปได้

 

เพียงแต่ คงต้องใช้เวลามากหน่อย

 

เพราะ method intervalAdd มันมีข้อจำกัด ที่มันไม่ยอมทำตามเรา ให้ตรวจหลังจาก

 

ที่ใส่ คนลงไปจนครบ แต่มันจะตรวจทุกครั้งที่เราใส่คนลงไป

 

เช่น ใส่ลงไป 2 คน มันจะตรวจว่า ใส่ไป 2 ครั้ง แทนที่จะเป็นครั้งเดียว

 

 

ถ้ามันตรวจแค่ครั้งเดียว คงทำได้แน่เลย เพราะใน intervalAdd นั่น ผมคงใส่ code ให้มัน ส่งกลับ element ที่เพิ่งเข้าได้

 

เพราะ มันจะอยู่ใน Object [] result ซึ่ง ค่ามันยังคงอยู่

 

แต่พอมันตรวจจับ 2 ครั้ง คราวนี้ ลำบากเลย เพราะมันจะส่งกลับไป ทั้งที่ยัง เคลื่อนย้ายคนที่ 2 ไปไม่เสร็จเลย

 

แบบนี้ มันเลยผิดวัตถุประสงค์เลย

 

 

บางที ผมอาจต้องหาวิธีการใหม่ ๆ ซึ่งยอมรับว่า กว่าจะหาได้สักวิธีการ บางที ผมใช้เวลาเป็นวันเลยครับ

 

แค่นั่งหาวิธีนี่ ใช้ไป 8 ชม. ยังเคยเลยครับ แหะ ๆ

 

 

ปล method ที่เป็น method ที่เรา ต้อง implements อย่าง intervalAdd นี่มันมี การทำงานที่สอดคล้อง กับ jre แบบที่

 

oracle เค้า กำหนด มาแล้ว อะครับ ไปเปลี่ยนมันให้ ตรวจจับ event แบบที่เราต้องการไม่ได้

 

คือ ถ้ามันตรวจแบบ ทุก element มันก็จะทำแบบนั้นตลอดเลย

 

คือจริง ๆ ถ้าจะตรวจว่า ในเรือ นั่งเกิน 2 คน หรือยัง มันก็ทำได้นะครับ อันนี้อะไม่ยาก แต่ถ้าจะตรวจว่า

 

ในเรือ มีการผิดกฎไหม หรือ บนฝั่ง ผิดกฏไหม อันนี้ อะยากครับ เพราะมันต้องให้ คนที่โยกย้าย

 

ย้ายกันให้เสร็จก่อน

 

 

ถ้าจะหาวิธีการใหม่ ผมอาจต้องเพิ่มปุ่ม ในการตรวจสอบ คือ เพิ่ม jbutton ให้เป็น การตรวจสอบ ว่า ต้องส่งคืนไหม แล้วทำการ set enabled ปุ่มที่เหลือ เป็น false ให้หมดเลย

 

 

แบบนี้จะเป็นการบังคับ user มากไปหรือเปล่าครับ แหะ ๆ


Edited by ทรงธรรม, 22 มีนาคม พ.ศ. 2556 - 07:55.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#18 RiDKuN_user

RiDKuN_user

    มหาเมพ

  • Members
  • PipPipPipPipPipPipPip
  • 13,167 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 08:16

ตรงๆ คือเยิ่นเย้อเกินไปครับ ควรจะปรับปรุงให้กระชับและชัดเจนกว่านี้

ชื่อ function ควรจะสื่อความหมาย และไม่รับ parameter ที่ไม่ได้ใช้งาน

เวลาทำงานซ้ำๆ ควรใช้ array, loop และ function ในการเขียน

ไม่ใช่ทำ 6 ทีก็ก้อปแปะ 6 รอบครับ จงจำไว้ว่า code ที่ดีคือ code ที่สั้นพอประมาณ 

เพราะย่อจนสั้นไปก็อ่านไม่รู้เรื่อง หรือเขียนจนยาวไปก็อ่านไม่รู้เรื่องเหมือนกันครับ  -_-

ขอบคุณ ทุกความเห็น นะครับ

 

โดยเฉพาะ อันนี้ เห็นจริง ตามนั้นเลยครับ

 

ถ้าให้ผมมาอ่าน code ตัวเองทีหลัง อาจไม่เข้าใจว่า function นี้ ใช้ทำอะไรก็ได้

 

ยอมรับ ว่าตอนสร้าง method มั่วตั้งชื่อ แบบส่ง ๆ เลยครับ ทีหลัง ผมต้องเปิด dic แล้ว เลือก ศัพท์ที่ลงตัวครับ(ผมไม่เก่งภาษา อะครับ)

 

ส่วนเรื่อง code ซ้ำ ก็ยอมรับ เลยครับ ว่าซ้ำจริง หลายจุดด้วย

 

เดี๋ยวผม ปิดงบ เสร็จแล้ว ผมจะลองมาแก้ไข ให้มัน ไปรวม กับ method ใด method หนึ่ง ที่รับกันได้ครับ

 

คือ ผมมันประเภท เขียน code แบบ ใจร้อนไปหน่อย เออ ตรงไหนใส่ได้ ก็ใส่ไปเลย

 

แล้วแบบ พอ run ได้ ก็เลยไม่ไปสนใจแก้ไขมันเลย แต่ถ้ามาอ่านอีกรอบ ก็เห็นจริง ตามนั้นเลยครับ

 

ถ้าหัดเขียน สามารถเขียนชื่อตัวแปรหรือชื่อ function เป็นภาษาไทยได้ด้วยครับถ้าคิดชื่ออังกฤษไม่ออก  ^_^


" ชีวิตผมไม่เคยกลัวอะไรทั้งนั้น ผมกลัวอย่างเดียว...กลัวจะถูกมองว่า 'ขายชาติ' " - The Last Tycoon

~ ทักษิณตาย เสรีไทยไชโย ~

#19 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 08:30

แหะ ๆ ขอใช้ เป็น ที่ note ไว้ก่อนนะครับ

 

เดี๋ยวผมจะลอง ให้ ใน method actionperformed ของ ทั้ง class addbutton และ removebutton

 

หลังจาก addelement และ removeelement ในทั้งสอง list แล้ว

 

จะเพิ่มการ assign ค่า ของ Object[] temp โดยรับค่าของ Object [] result เข้าไป

 

แล้วทำการ เปลี่ยนค่าใน Object[] result ให้เป็น " " ทั้งหมด

 

 

แล้วใน method intervalAdd จะ check ว่า ใน Object [] result มีค่าเป็น " " หรือยัง ถ้าเป็นแล้ว

 

น่าจะแสดงว่า การโยกย้ายเสร็จแล้ว

 

แล้วค่อยให้มัน check ความถูกต้องของกฏ ใน list อีกที

 

แล้วถ้าไม่ถูก ค่อยเรียก method เพื่อ ส่งกลับ element

 

โดยใช้ค่าของ Object [] temp ที่เรา assign ค่าของ Object [] result ไว้ก่อนหน้า แล้ว แทน

 

 

แต่ยังไม่รู้จะ work ไหม เพราะ เวลา run ถ้า jre มันงง ว่าอันไหน ควรเกิดก่อน มันชอบ run แบบค้าง ๆ อะ

 

ปล ถ้ามัน work นะ จะเพิ่ม Thread sleep ก่อนที่จะทำการ ส่งกลับ element สัก 3 วินาที ให้มัน showWarning ให้เห็นก่อน

 

แหะ ๆ คิดซะเลิศหรู run ไม่ได้ ก็จบเห่


Edited by ทรงธรรม, 22 มีนาคม พ.ศ. 2556 - 08:47.

ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#20 RiDKuN_user

RiDKuN_user

    มหาเมพ

  • Members
  • PipPipPipPipPipPipPip
  • 13,167 posts

ตอบ 22 มีนาคม พ.ศ. 2556 - 20:37

อีกอย่างคือควรจะใช้ generic ด้วยครับ จะทำให้อ่านง่ายขึ้น ไม่งั้นทุกอย่างก็เป็น type Object หมด
" ชีวิตผมไม่เคยกลัวอะไรทั้งนั้น ผมกลัวอย่างเดียว...กลัวจะถูกมองว่า 'ขายชาติ' " - The Last Tycoon

~ ทักษิณตาย เสรีไทยไชโย ~

#21 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 27 มีนาคม พ.ศ. 2556 - 14:15

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 Object temper;
	private static String hint;
	private static int count = 0;
	private static int beep = 0;
	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);
		result = listStart.getSelectedValues();
		message.setText(prefix + "Select at most 2 guys");
	}

	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();
			System.out.println(temper.toString());
			count += 1;
			System.out.println(count);
			
			if (((temper == "go")&&(count==2))
					||(temper=="one")) {
				if (lm == modelStart) {
					if (checkLand()) {
						hint = "sp";
						
						showPeaceful();
						testForHint();
					} else {
						if (!checkStart()) {
							
							showWarning(listStart);
							message
									.setText(prefix
											+ "Break the rules on Start");
							turnBackElement();
							
						}
					}
				} else if (lm == modelShip) {
					if (checkLand()) {
						if(hint.equals("sp")){
							hint = "ps";
						}else if(hint.equals("dp")){
							hint = "pd";
						}
						showPeaceful();
						testForHint();
					} else {
						if (!checkShip()) {
							
							showWarning(listShip);
							message.setText(prefix + "Break the rules on Ship");
							turnBackElement();
							
						}else{
							flowWarning(listShip);
						}
					}
					if (modelShip.getSize() > 2) {
						showWarning(listShip);
						message.setText(prefix + "Ship can't load over 2 guys");
						turnBackElement();
						
					}
				} else if (lm == modelDest) {
					if (checkLand()) {
						hint = "dp";
						showPeaceful();
						testForHint();
					} else {
						if (!checkDest()) {
							showWarning(listDest);
							message.setText(prefix + "Break the rules on Dest");
							turnBackElement();
							
						}
					}
					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);
						}
					}
				}
			}else if(temper == " "){
				if (checkLand()) {
					
					showPeaceful();
					testForHint();
				}
				
			}
		}

		public void intervalRemoved(ListDataEvent e) {
			MyListModel lm = (MyListModel) e.getSource();
			
			if (lm == modelStart) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkStart()) {
						showWarning(listStart);
						message.setText(prefix + "Break the rules on Start" +
						" ,please go back");
					}else{
						flowWarning(listStart);
					}
				}
			} else if (lm == modelShip) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkShip()) {
						showWarning(listShip);
						message.setText(prefix + "Break the rules on Ship");
					} else {
						flowWarning(listShip);
					}
				}
			} else if (lm == modelDest) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkDest()) {
						showWarning(listDest);
						message.setText(prefix + "Break the rules on Dest" +
						 " ,please go back");
					}
				}
			}

		}

	}
	private void testForHint(){
		if (hint.equals("sp")) {
			
			sToShip.setEnabled(true);
			shipToD.setEnabled(false);
		} else if (hint.equals("dp")) {
			
			dToShip.setEnabled(true);
			shipToS.setEnabled(false);
		} else if (hint.equals("ps")) {
			
			shipToD.setEnabled(true);
			sToShip.setEnabled(false);
		} else if (hint.equals("pd")) {
			
			shipToS.setEnabled(true);
			dToShip.setEnabled(false);
		}
	}
	private void turnBackElement() {
		try {
			
			Thread.sleep(3000);
			temper = " ";
			if (hint.equals("sp")) {
				modelShip.removeArrayElement(result);
				modelStart.addArrayElement(result);
				
			} else if (hint.equals("dp")) {
				modelShip.removeArrayElement(result);
				modelDest.addArrayElement(result);
				
			} else if (hint.equals("ps")) {
				modelStart.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			} else if (hint.equals("pd")) {
				modelDest.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		message.setText(prefix+"No permission to go,please change selection");
	}

	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() {
		message.setText(prefix + "look good");
		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) {
			JList comp = (JList) e.getSource();
			
			if (!e.getValueIsAdjusting()) {
				if (comp == listStart) {
					
					if (!getSelectionList(e, listStart)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				} else if (comp == listShip) {
					if (!getSelectionList(e, listShip)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				} else if (comp == listDest) {
					if (!getSelectionList(e, listDest)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				}
			}
			if(beep>=1){
				comp.clearSelection();
				beep = 0;
			}
		}

	}

	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) {
			
			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 {
				
				selectOK = true;
			}
		}

		return selectOK;
	}

	class AddButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JComponent comp = (JComponent) e.getSource();
			count = 0;
			beep = 0;
			if (comp == sToShip) {
				result = listStart.getSelectedValues();
				hint = "sp";
				modelStart.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
				
			} else if (comp == dToShip) {
				result = listDest.getSelectedValues();
				hint = "dp";
				modelDest.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			}
		}
	}

	class RemoveButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JComponent comp = (JComponent) e.getSource();
			count = 0;
			beep = 0;
			if (comp == shipToS) {
				result = listShip.getSelectedValues();
				hint = "ps";
				modelShip.removeArrayElement(result);
				modelStart.addArrayElement(result);
				
				if (modelShip.size() == 0) {
					
				}
			} else if (comp == shipToD) {
				result = listShip.getSelectedValues();
				hint = "pd";
				
				modelShip.removeArrayElement(result);
				modelDest.addArrayElement(result);
				
				if (modelShip.size() == 0) {
					
				}

			}
		}
	}

	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 ((modelShip.contains(womanOne) && (modelShip.contains(manTwo) || (modelShip
				.contains(manThree))))
				&& (!modelShip.contains(manOne))) {
			nbeep = false;
		}
		if ((modelShip.contains(womanTwo) && (modelShip.contains(manOne) || (modelShip
				.contains(manThree))))
				&& (!modelShip.contains(manTwo))) {
			nbeep = false;
		}
		if ((modelShip.contains(womanThree) && (modelShip.contains(manOne) || (modelShip
				.contains(manTwo))))
				&& (!modelShip.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();
			}
		});
	}

}



มาแล้ว ListShip MkII มาพร้อมให้ท่านประลอง กันอีกแล้วครับ

 

ปรับปรุง ไม่ให้ทำผิด กติกา ได้ อีกแล้ว เชิญจ้า ใครอยากลอง


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#22 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 28 มีนาคม พ.ศ. 2556 - 07:11

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 Object temper;
	private static String hint;
	private static int count = 0;
	
	private static int beep = 0;
	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);
		result = listStart.getSelectedValues();
		message.setText(prefix + "Select at most 2 guys");
	}

	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();
			System.out.println(temper.toString());
			count += 1;
			System.out.println(count);
			
			if (((temper == "go")&&(count==2))
					||(temper=="one")) {
				if (lm == modelStart) {
					if (checkLand()) {
						hint = "sp";
						
						showPeaceful();
						testForHint();
					} else {
						if (!checkStart()) {
							
							showWarning(listStart);
							message
									.setText(prefix
											+ "Break the rules on Start");
							turnBackElement();
							
						}
					}
				} else if (lm == modelShip) {
					if (checkLand()) {
						if(hint.equals("sp")){
							hint = "ps";
						}else if(hint.equals("dp")){
							hint = "pd";
						}
						showPeaceful();
						testForHint();
					} else {
						if (!checkShip()) {
							
							showWarning(listShip);
							message.setText(prefix + "Break the rules on Ship");
							turnBackElement();
							
						}else{
							if(hint.equals("sp")){
								hint = "pd";
							}else if(hint.equals("dp")){
								hint = "ps";
							}
							testForHint();
							flowWarning(listShip);
						}
					}
					if (modelShip.getSize() > 2) {
						showWarning(listShip);
						message.setText(prefix + "Ship can't load over 2 guys");
						turnBackElement();
						
					}
				} else if (lm == modelDest) {
					if (checkLand()) {
						hint = "dp";
						showPeaceful();
						testForHint();
					} else {
						if (!checkDest()) {
							showWarning(listDest);
							message.setText(prefix + "Break the rules on Dest");
							turnBackElement();
							
						}
					}
					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);
						}
					}
				}
			}else if(temper == " "){
				if (checkLand()) {
					
					showPeaceful();
					testForHint();
				}
				
			}
		}

		public void intervalRemoved(ListDataEvent e) {
			MyListModel lm = (MyListModel) e.getSource();
			
			if (lm == modelStart) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkStart()) {
						showWarning(listStart);
						message.setText(prefix + "Break the rules on Start" +
						" ,please go back");
						
					}else{
						flowWarning(listStart);
					}
				}
			} else if (lm == modelShip) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkShip()) {
						showWarning(listShip);
						message.setText(prefix + "Break the rules on Ship");
					} else {
						flowWarning(listShip);
					}
				}
			} else if (lm == modelDest) {
				if (checkLand()) {

					showPeaceful();
				} else {
					if (!checkDest()) {
						showWarning(listDest);
						message.setText(prefix + "Break the rules on Dest" +
						 " ,please go back");
						
					}
				}
			}
			

		}

	}
	private void testForHint(){
		if (hint.equals("sp")) {
			
			sToShip.setEnabled(true);
			shipToD.setEnabled(false);
		} else if (hint.equals("dp")) {
			
			dToShip.setEnabled(true);
			shipToS.setEnabled(false);
		} else if (hint.equals("ps")) {
			
			shipToD.setEnabled(true);
			sToShip.setEnabled(false);
		} else if (hint.equals("pd")) {
			
			shipToS.setEnabled(true);
			dToShip.setEnabled(false);
		}
	}
	private void turnBackElement() {
		try {
			
			Thread.sleep(3000);
			temper = " ";
			if (hint.equals("sp")) {
				modelShip.removeArrayElement(result);
				modelStart.addArrayElement(result);
				
			} else if (hint.equals("dp")) {
				modelShip.removeArrayElement(result);
				modelDest.addArrayElement(result);
				
			} else if (hint.equals("ps")) {
				modelStart.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			} else if (hint.equals("pd")) {
				modelDest.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		message.setText(prefix+"No permission to go,please change selection");
	}

	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() {
		message.setText(prefix + "look good");
		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) {
			JList comp = (JList) e.getSource();
			
			if (!e.getValueIsAdjusting()) {
				if (comp == listStart) {
					
					if (!getSelectionList(e, listStart)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				} else if (comp == listShip) {
					if (!getSelectionList(e, listShip)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				} else if (comp == listDest) {
					if (!getSelectionList(e, listDest)) {
						Toolkit.getDefaultToolkit().beep();
						beep += 1;
					} else {
						if(result.length==1){
							temper = "one";
						}else{
						temper = "go";
						}
					}
					
				}
			}
			if(beep>=1){
				comp.clearSelection();
				beep = 0;
			}
		}

	}

	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) {
			
			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 {
				
				selectOK = true;
			}
		}

		return selectOK;
	}

	class AddButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JComponent comp = (JComponent) e.getSource();
			count = 0;
			
			beep = 0;
			if (comp == sToShip) {
				result = listStart.getSelectedValues();
				hint = "sp";
				modelStart.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
				
			} else if (comp == dToShip) {
				result = listDest.getSelectedValues();
				hint = "dp";
				modelDest.removeArrayElement(result);
				modelShip.addArrayElement(result);
				
			}
		}
	}

	class RemoveButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JComponent comp = (JComponent) e.getSource();
			count = 0;
			
			beep = 0;
			if (comp == shipToS) {
				result = listShip.getSelectedValues();
				hint = "ps";
				modelShip.removeArrayElement(result);
				modelStart.addArrayElement(result);
				
				
			} else if (comp == shipToD) {
				result = listShip.getSelectedValues();
				hint = "pd";
				
				modelShip.removeArrayElement(result);
				modelDest.addArrayElement(result);
				
				

			}
		}
	}

	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 ((modelShip.contains(womanOne) && (modelShip.contains(manTwo) || (modelShip
				.contains(manThree))))
				&& (!modelShip.contains(manOne))) {
			nbeep = false;
		}
		if ((modelShip.contains(womanTwo) && (modelShip.contains(manOne) || (modelShip
				.contains(manThree))))
				&& (!modelShip.contains(manTwo))) {
			nbeep = false;
		}
		if ((modelShip.contains(womanThree) && (modelShip.contains(manOne) || (modelShip
				.contains(manTwo))))
				&& (!modelShip.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();
			}
		});
	}

}

แหะ ๆ แก้ไขเพิ่มเติม เป็น ListShip MkII version 2.01 แก้ไขข้อผิดพลาด

 

ตอนออก Start โดยให้ man 2 คน ออกไปพร้อมกัน แล้ว ไปต่อไม่ได้ สามารถกลับมายังจุด เริ่มต้น ได้แล้ว

 

น่าจะ สมบุรณ์แบบ แล้วนะ กับการรักษากฏ

 

สิริรวม ใช้เวลา ไปทั้งสิ้น 23 ชม. ได้มั้งครับ

 

แหะ ๆ เหนื่อยเป็นบ้า เลย นั่งแก้ ทั้งวัน เมื่อวาน


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY


#23 phoosana

phoosana

    เมพ

  • Members
  • PipPipPipPipPip
  • 7,687 posts

ตอบ 28 มีนาคม พ.ศ. 2556 - 10:50

ยังเจอข้อผิดพลาดอยู่

ลองเล่นมั่วๆ ดู

ทำไปทำมา woman-poona บางทีก็ woman-pink โคลนตัวเองออกมาอีกร่าง :lol:


We love fender.

#24 ทรงธรรม

ทรงธรรม

    ต่อให้ต้องเรียนจนแก่ ก็จะเรียนต่อไป คนเราพัฒนาได้ทุกคน

  • Members
  • PipPipPip
  • 2,157 posts

ตอบ 28 มีนาคม พ.ศ. 2556 - 11:14

ยังเจอข้อผิดพลาดอยู่

ลองเล่นมั่วๆ ดู

ทำไปทำมา woman-poona บางทีก็ woman-pink โคลนตัวเองออกมาอีกร่าง :lol:

เป็น version 2.01 หรือเปล่าครับ เพราะ version 2 ก่อนหน้า มีจุดผิดพลาดอยู่

 

แล้ว มันจะ โคลน ในกรณี ที่ เรา เลือก แบบไหน ครับ พอทราบไหม

 

ผมจะได้ ไปแก้ไข อะครับ

 

เพราะเมื่อกี้ เท่าที่ผมลอง ๆ ดู ยังไม่เจอ แบบที่ว่า อะครับ

 

แต่ถ้าเป็น version สอง ปกติ นี่ ผมเจอ ครับ เพิ่งแก้ไข เมื่อเช้า


ขอให้พวกเรา ชาวหลากสี และพันธมิตร จงมีชีวิตรอด จากภาวะเศรษฐกิจตกต่ำ ฝีมือปูนา ไปตลอดรอดฝั่งด้วยครับ

 

PEMDAS ย่อมาจาก ลำดับการคำนวณ Parentheses , Exponentials , Multiply , Divide , Add , Subtract

 

FWGHSO ย่อมาจาก ลำดับการประเมินผลของ query  FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY





ผู้ใช้ 1 ท่านกำลังอ่านกระทู้นี้

สมาชิก 0 ท่าน, ผู้เยี่ยมชมทั่วไป 1 ท่าน และไม่เปิดเผยตัวตน 0 ท่าน