XB Tool

类别:Java 点击:0 评论:0 推荐:

package gemini.tool;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
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;

/**
 * @author Leif.Wang Last Modified:2004-10-13
 * 
 */
public class XbTool
  extends JPanel
  implements ActionListener, ListSelectionListener {
  private static final String NEW_LINE = "\n";
  private static final String SPLIT = " | ";
  private static final String CAPTION = "XB tool";
  private static final String ATTACK = "主动攻击";
  private static final String GANG = "群体";
  private static final String POISON = "中毒";
  private static final String DESTROY = "破坏盔甲";
  private static final int POS_X = 250;
  private static final int POS_Y = 180;
  private static final int LIST_WIDTH = 200;
  private static final int LIST_HEIGHT = 300;
  private static final int FRAME_WIDTH = 500;
  private static final int FRAME_HEIGHT = 500;

  private JButton openButton, saveButton;
  private JCheckBox attackBox, gangBox, poisonBox, destroyBox;
  private JFileChooser fc;
  private ArrayList monsters;
  private JList list;
  private DefaultListModel listModel;
  private JTextField levelField;
  private JLabel filePathLabel;
 
  public XbTool() {
    super(new BorderLayout());

    //Create a file chooser
    fc = new JFileChooser();

    //Create the open button. We use the image from the JLF
    //Graphics Repository (but we extracted it from the jar).
    openButton = new JButton("Open a File...");
    openButton.addActionListener(this);

    //Create the save button. We use the image from the JLF
    //Graphics Repository (but we extracted it from the jar).
    saveButton = new JButton("Save a File...");
    saveButton.addActionListener(this);

    //For layout purposes, put the buttons in a separate panel
    JPanel buttonPanel = new JPanel(); //use FlowLayout
    buttonPanel.add(openButton);
    buttonPanel.add(saveButton);

    // Creates a list model
    listModel = new DefaultListModel();
    listModel.addElement("ID" + SPLIT + "Name");

    // Creates a list
    list = new JList(listModel);
    list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    list.setLayoutOrientation(JList.VERTICAL);
    list.setVisibleRowCount(-1);
    list.addListSelectionListener(this);

    // Creates a scroll pane for the list
    JScrollPane listScroller = new JScrollPane(list);
    listScroller.setPreferredSize(new Dimension(LIST_WIDTH, LIST_HEIGHT));

    // Creates text field for level
    levelField = new JTextField();
    levelField.addActionListener(this);

    // Creates check boxes
    attackBox = new JCheckBox(ATTACK);
    attackBox.setSelected(false);
    attackBox.addActionListener(this);

    gangBox = new JCheckBox(GANG);
    gangBox.setSelected(false);
    gangBox.addActionListener(this);

    poisonBox = new JCheckBox(POISON);
    poisonBox.setSelected(false);
    poisonBox.addActionListener(this);

    destroyBox = new JCheckBox(DESTROY);
    destroyBox.setSelected(false);
    destroyBox.addActionListener(this);

    filePathLabel = new JLabel("Please open a cfg file!");
   
    // Creates a panel for the check boxes
    JPanel checkPanel = new JPanel();
    checkPanel.setLayout(new BoxLayout(checkPanel, BoxLayout.PAGE_AXIS));
    checkPanel.add(filePathLabel);
    checkPanel.add(levelField);
    checkPanel.add(attackBox);
    checkPanel.add(gangBox);
    checkPanel.add(poisonBox);
    checkPanel.add(destroyBox);

    //Add the buttons and the log to this panel.
    add(buttonPanel, BorderLayout.PAGE_START);
    add(listScroller, BorderLayout.WEST);
    add(checkPanel, BorderLayout.CENTER);
  }

  /**
   * Handles event for buttons
   */
  public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();

    if (source == openButton) {
      if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        File file = fc.getSelectedFile();
        filePathLabel.setText(file.getPath());
       
        // Gets monsters from file
        monsters = (ArrayList) Monster.loadMonstersFromFile(file);

        for (int i = 0; i < monsters.size(); i++) {
          Monster monster = (Monster) monsters.get(i);
          listModel.addElement(monster.getId() + SPLIT + monster.getName());
        }
      }
    } else if (source == saveButton) {
      if (monsters != null
          && fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
        File file = fc.getSelectedFile();
        Monster.saveMonstersIntoFile(monsters, file);
      }
    } else {
      if (list.getSelectedIndex() < 1)
        return;
     
      // Gets the monster
      Monster monster = (Monster) monsters.get(list.getSelectedIndex() - 1);

      // Sets the properites
      if (source == attackBox) {
        monster.setAttack(attackBox.isSelected());
      } else if (source == gangBox) {
        monster.setGang(gangBox.isSelected());
      } else if (source == poisonBox) {
        monster.setPoison(poisonBox.isSelected());
      } else if (source == destroyBox) {
        monster.setDestroy(destroyBox.isSelected());
      } else if (source == levelField) {
        try {
          monster.setLevel(Integer.parseInt(levelField.getText()));
        } catch (NumberFormatException e1) {
          JOptionPane.showMessageDialog(
            null,
            "Please input a number!",
            "Information",
            JOptionPane.INFORMATION_MESSAGE);
        }
      }
    }
  }

  /**
   * Handles event for list
   */
  public void valueChanged(ListSelectionEvent e) {
    int index = list.getSelectedIndex();
    if (index == 0)
      return;

    Monster monster = (Monster) monsters.get(index - 1);

    levelField.setText(monster.getLevel() + "");
    attackBox.setSelected(monster.isAttack());
    gangBox.setSelected(monster.isGang());
    poisonBox.setSelected(monster.isPoison());
    destroyBox.setSelected(monster.isDestroy());
  }

  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    //Make sure we have nice window decorations.
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);

    //Create and set up the window.
    JFrame frame = new JFrame(CAPTION);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(POS_X, POS_Y);

    //Create and set up the content pane.
    JComponent newContentPane = new XbTool();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    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();
      }
    });
  }

}

////////////////////////////////////////////////////////////////////////////
package gemini.tool;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

/**
 * @author Leif.Wang
 * Last Modified:2004-10-13
 * 
 */
public class Monster {
  private static final String SPLIT = "\t,";
  private static final String REG_SPLIT = "\\,";
 
  private int id;
  private String name;
  private int level;
  private boolean attack;
  private boolean gang;
  private boolean poison;
  private boolean destroy;

  public void setDestroy(boolean destroy) {
    this.destroy = destroy;
  }

  public boolean isDestroy() {
    return destroy;
  }

  public void setPoison(boolean poison) {
    this.poison = poison;
  }

  public boolean isPoison() {
    return poison;
  }

  public void setGang(boolean gang) {
    this.gang = gang;
  }

  public boolean isGang() {
    return gang;
  }

  public void setAttack(boolean attack) {
    this.attack = attack;
  }

  public boolean isAttack() {
    return attack;
  }

  public void setLevel(int level) {
    this.level = level;
  }

  public int getLevel() {
    return level;
  }

  public String getName() {
    return name;
  }

  public int getId() {
    return id;
  }

  /**
   * Default constructor
   */
  public Monster() {
    id = 0;
    name = "";
    setLevel(0);
    setAttack(false);
    setGang(false);
    setPoison(false);
    setDestroy(false);
  }

  /**
   * Constructor with parameters
   */
  public Monster(int id, String name, int level, boolean attack, boolean gang,
    boolean poison, boolean destroy) {
    this.id = id;
    this.name = name;
    this.setLevel(level);
    this.setAttack(attack);
    this.setGang(gang);
    this.setPoison(poison);
    this.setDestroy(destroy);
  }

  /**
   * Overides Objects toString method to display monster information
   *
   * @see java.lang.Object#toString()
   */
  public String toString() {
    return "$" + getId() + SPLIT
      + getName() + SPLIT
      + getLevel() + SPLIT
      + (isAttack() ? "1" : "0") + SPLIT
      + (isGang() ? "1" : "0") + SPLIT
      + (isPoison() ? "1" : "0") + SPLIT
      + (isDestroy() ? "1" : "0")
      + "\t;";
  }

  /**
   * Gets monsters from file
   */
  public static Collection loadMonstersFromFile(File file) {
    try {
      ArrayList monsters = new ArrayList();
      BufferedReader buffer = new BufferedReader(new FileReader(file));

      String line = buffer.readLine();
      Monster monster = null;

      while (line != null) {
        String[] parameters = line.split(REG_SPLIT);

        monster = new Monster(
            Integer.parseInt(parameters[0].trim().substring(1)),
            parameters[1].trim(),
            Integer.parseInt(parameters[2].trim()),
            "1".equals(parameters[3].trim()),
            "1".equals(parameters[4].trim()),
            "1".equals(parameters[5].trim()),
            "1".equals(parameters[6].charAt(0) + "")
            );
       
        monsters.add(monster);
        line = buffer.readLine();
      }

      return monsters;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }
 
  /**
   * Save the  monsters information into file
   */
  public static void saveMonstersIntoFile(ArrayList monsters, File file) {
    DataOutputStream out = null;
    try {
      out = new DataOutputStream(new FileOutputStream(file));
     
      for (int i = 0; i < monsters.size(); i++) {
        out.writeBytes(monsters.get(i).toString() + "\n");
      }
     
      out.flush();
      out.close();
    } catch (Exception e) {
      try {
        out.close();
      } catch (IOException e1) {
        e1.printStackTrace();
      }
      e.printStackTrace();
    }
  }
}

本文地址:http://com.8s8s.com/it/it14669.htm