Liny_@NotePad

沉迷ACG中

无聊之作。。随机组句。。

YOYO posted @ 2010年3月17日 21:12 in 【Java SE】 , 2655 阅读

《大象》的第一章里作者提到了一个小游戏:小的时候,每个人各填一张纸条,丢进代表主体、地点、动作、客体的箱子中,再在里面分别抽一张组成一句完整的话。

因为很无聊,于是就写写看~

功能很简单,就是可以输入主体、地点、动作、客体(也可以从文件导入,或是导出)。随机在列表中组成一句话。

嗯,单击结果会自动复制到剪贴板。

程序如下(纯打发时间性质,就没有写注释):

package org.yoyo.game;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;

/**
 * 
 * @author YOYO
 * 
 */
@SuppressWarnings("serial")
public class RandomGame extends JFrame {

	/**
	 * Labels' String
	 */
	private String[] title = new String[] { "主体:", "地点:", "动作:", "客体:" };

	/**
	 * Text Field
	 */
	private JTextField[] field = new JTextField[4];

	/**
	 * Buttons
	 */
	private JButton[] addBtn = new JButton[4];
	private JButton[] delBtn = new JButton[4];
	private JButton[] importBtn = new JButton[4];
	private JButton[] exportBtn = new JButton[4];
	private JButton generateBtn = new JButton("Generate");
	private JButton exportResultBtn = new JButton("Export Result");

	/**
	 * Data Vector
	 */
	@SuppressWarnings("unchecked")
	private Vector[] data = new Vector[4];
	private Vector<String> history = new Vector<String>();

	/**
	 * JList
	 */
	private JList[] list = new JList[4];
	private JList historyList = new JList();

	/**
	 * Result Field
	 */
	private JTextField result = new JTextField(30);

	/**
	 * Randomer
	 */
	private Random randomer = new Random();

	/**
	 * 
	 */
	public RandomGame() {
		this.setTitle("Random Game");
		this.setSize(630, 560);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Toolkit tools = Toolkit.getDefaultToolkit();
		int screenWidth = tools.getScreenSize().width;
		int screenHeight = tools.getScreenSize().height;
		this.setLocation((screenWidth - this.getWidth()) / 2,
				(screenHeight - this.getHeight()) / 2);

		this.fillComponents();

		this.setVisible(true);
	}

	/**
	 * 
	 */
	private void fillComponents() {
		this.setLayout(new FlowLayout(FlowLayout.CENTER));

		// input Panel
		this.add(new JPanel() {
			{
				this.setPreferredSize(new Dimension(630, 270));

				this.setLayout(new GridLayout(1, 4));

				for (int i = 0; i < 4; ++i) {
					final int j = i;
					this.add(new JPanel() {
						{
							this.add(new JLabel(title[j]));

							addBtn[j] = new JButton("+");
							this.add(addBtn[j]);

							delBtn[j] = new JButton("-");
							this.add(delBtn[j]);

							field[j] = new JTextField(12);
							this.add(field[j]);

							data[j] = new Vector<String>();

							addBtn[j].addActionListener(new ActionListener() {

								@Override
								public void actionPerformed(ActionEvent arg0) {
									String text = field[j].getText().trim();
									importData(j, text);
								}

							});

							delBtn[j].addActionListener(new ActionListener() {

								@Override
								public void actionPerformed(ActionEvent arg0) {
									String text = field[j].getText().trim();
									if (!text.isEmpty()
											&& data[j].contains(text)) {
										data[j].remove(text);
										list[j].setListData(data[j]);
										field[j].setText("");
										field[j].requestFocus();
									}
								}

							});

							list[j] = new JList();
							list[j]
									.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
							list[j].setFixedCellWidth(130);
							list[j].setFixedCellHeight(20);
							list[j]
									.addListSelectionListener(new ListSelectionListener() {

										@Override
										public void valueChanged(
												ListSelectionEvent e) {
											field[j].setText((String) list[j]
													.getSelectedValue());
										}

									});

							JScrollPane pane = new JScrollPane(list[j]);
							pane
									.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
							pane
									.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
							this.add(pane);

							importBtn[j] = new JButton("Import");
							this.add(importBtn[j]);

							exportBtn[j] = new JButton("Export");
							this.add(exportBtn[j]);

							importBtn[j]
									.addActionListener(new ActionListener() {

										@Override
										public void actionPerformed(
												ActionEvent e) {
											JFileChooser chooser = new JFileChooser();
											chooser.removeChoosableFileFilter(chooser.getFileFilter());
											chooser.addChoosableFileFilter(new FileFilter() {

												@Override
												public boolean accept(File file) {
													if (file.isDirectory()) return true;
													return file.getName().endsWith(".txt");
												}

												@Override
												public String getDescription() {
													return ".txt";
												}
												
											});
											int returnVal = chooser
													.showOpenDialog(RandomGame.this);
											if (returnVal == JFileChooser.APPROVE_OPTION) {
												File file = chooser
														.getSelectedFile();
												BufferedReader reader = null;
												try {
													reader = new BufferedReader(
															new FileReader(file));
													String line;
													while ((line = reader
															.readLine()) != null) {
														importData(j, line);
													}
												} catch (FileNotFoundException e1) {
													e1.printStackTrace();
												} catch (IOException e2) {
													e2.printStackTrace();
												}
												try {
													reader.close();
												} catch (IOException e1) {
													e1.printStackTrace();
												}
											}
										}

									});

							exportBtn[j]
									.addActionListener(new ActionListener() {

										@Override
										public void actionPerformed(
												ActionEvent e) {
											saveFile(data[j]);
										}
									});
						}
					});
				}
			}
		});

		// result Panel
		this.add(new JPanel() {
			{
				this.setPreferredSize(new Dimension(600, 80));
				this.setLayout(new GridLayout(2, 1));
				this.add(new JPanel() {
					{
						this.add(generateBtn);
						this.add(exportResultBtn);

						generateBtn.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								for (int i = 0; i < 4; ++i) {
									if (data[i].size() < 1) {
										result.setText("请先填入内容");
										return;
									}
								}
								String person = (String) data[0].get(randomer
										.nextInt(data[0].size()));
								String address = (String) data[1].get(randomer
										.nextInt(data[1].size()));
								String dosth = (String) data[2].get(randomer
										.nextInt(data[2].size()));
								String object = (String) data[3].get(randomer
										.nextInt(data[3].size()));

								result.setText(person + "在" + address + dosth
										+ object);

								history.add(result.getText());
								historyList.setListData(history);
								int rowIndex = history.size() - 1;
								historyList.scrollRectToVisible(historyList.getCellBounds(rowIndex,
										rowIndex));
							}

						});

						exportResultBtn.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								saveFile(history);
							}

						});
					}
				});

				result.setEditable(false);
				this.add(result);
			}
		});

		this.add(new JPanel() {
			{
				historyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
				historyList.setFixedCellWidth(600);
				historyList.setFixedCellHeight(18);

				historyList.addListSelectionListener(new ListSelectionListener() {

					@Override
					public void valueChanged(ListSelectionEvent e) {
						StringSelection stsel = new StringSelection((String) historyList.getSelectedValue());
				        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);
					}
					
				});
				
				JScrollPane pane = new JScrollPane(historyList);
				pane
						.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
				pane
						.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
				this.add(pane);
			}
		});
	}

	@SuppressWarnings("unchecked")
	public void importData(int index, String text) {
		if (!text.isEmpty() && !data[index].contains(text)) {
			data[index].add(text);
			list[index].setListData(data[index]);
			int rowIndex = data[index].size() - 1;
			list[index].scrollRectToVisible(list[index].getCellBounds(rowIndex,
					rowIndex));
			field[index].setText("");
			field[index].requestFocus();
		}
	}

	@SuppressWarnings("unchecked")
	private void saveFile(Vector content) {
		JFileChooser chooser = new JFileChooser();
		chooser.removeChoosableFileFilter(chooser.getFileFilter());
		chooser.addChoosableFileFilter(new FileFilter() {

			@Override
			public boolean accept(File file) {
				if (file.isDirectory()) return true;
				return file.getName().endsWith(".txt");
			}

			@Override
			public String getDescription() {
				return ".txt";
			}
			
		});
		int returnVal = chooser.showSaveDialog(RandomGame.this);
		if (returnVal == JFileChooser.APPROVE_OPTION) {
			File file = chooser.getSelectedFile();
			PrintWriter writer = null;
			try {
				String ext = "";
				if (!file.getName().endsWith(".txt")) {
					ext = ".txt";
				}
				writer = new PrintWriter(file.getPath() + ext);
				for (Object line : content) {
					writer.write(line + "\r\n");
				}
				writer.flush();
				writer.close();
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new RandomGame();
	}

}

 

 

附几个txt:

主体

YOYO
Cyin
Skittles
Lee
Die
Mistoetle
Vanish
Duck

 

 

地点

教室
图书馆
宿舍
食堂
实验室
篮球场
学生街
健身房

动作

吃
喝
玩
打
听
说
读
写
唱
爬
跑
跳
看
养

 

客体

房子
小毛驴
兔子
游戏
电脑
牛排
奶茶
咖啡
豆浆
怪味豆
苏打绿
电视
仓鼠
课本
MP3
楼梯
山
程序
论文
CET6词汇
PSP

 

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter