我想说的是,你应该考虑提取您的控制台程序的核心逻辑和数据来创建一个模型类或类,然后使用这些设置ActionListener
你的按钮在您的控制台程序或GUI中。
例如说,你有这样的得到了别人的姓名和出生日期信息的简单的控制台程序:
class SimpleConsole {
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
System.out.print("Please enter your name: ");
String name = scanner.nextLine();
System.out.print("Please enter your date of birth as mm/dd/yyyy: ");
String dateString = scanner.nextLine();
Date dateOfBirth = new SimpleDateFormat("MM/dd/yyyy").parse(dateString);
Calendar birthday = Calendar.getInstance();
birthday.setTime(dateOfBirth);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - birthday.get(Calendar.YEAR);
birthday.set(Calendar.YEAR, today.get(Calendar.YEAR));
if (birthday.compareTo(today) > 0) {
age--;
}
System.out.println("Hello, " + name + ". Your age is: " + age);
}
}
我做的是首先要提取此程序中的关键信息和逻辑,使一类,说叫人持有一个名称的字符串,一出生日期日期字段和calculateAge()方法:
class Person {
String name;
Date dateOfBirth;
public Person(String name, Date dateOfBirth) {
this.name = name;
this.dateOfBirth = dateOfBirth;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public int getAge() {
Calendar birthday = Calendar.getInstance();
birthday.setTime(dateOfBirth);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - birthday.get(Calendar.YEAR);
birthday.set(Calendar.YEAR, today.get(Calendar.YEAR));
if (birthday.compareTo(today) > 0) {
age--;
}
return age;
}
}
,现在你可以创建一个使用人一个控制台程序:
class BetterConsole {
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
System.out.print("Please enter your name: ");
String name = scanner.nextLine();
System.out.print("Please enter your date of birth as mm/dd/yyyy: ");
String dateString = scanner.nextLine();
Date dateOfBirth = new SimpleDateFormat("MM/dd/yyyy").parse(dateString);
Person person = new Person(name, dateOfBirth);
System.out.println("Hello, " + person.getName() + ". Your age is: " + person.getAge());
scanner.close();
}
}
但更重要的是,Person类可以很容易地用在任何你想要的GUI程序中。我必须去睡觉,所以我现在不能显示GUI,但可能明天。
啊哎呀,这里的GUI为例:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
public class BirthdayGui extends JPanel {
private static final String PATTERN = "MM/dd/yyyy";
private JTextField nameField = new JTextField(10);
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PATTERN);
private JFormattedTextField birthDayField = new JFormattedTextField(simpleDateFormat);
private PersonTableModel tableModel = new PersonTableModel();
private JTable table = new JTable(tableModel);
public BirthdayGui() {
setLayout(new BorderLayout());;
add(new JScrollPane(table), BorderLayout.CENTER);
add(createDataEntryPanel(), BorderLayout.PAGE_END);
}
private JPanel createDataEntryPanel() {
birthDayField.setColumns(nameField.getColumns());
JPanel dataInPanel = new JPanel();
dataInPanel.add(new JLabel("Enter Name:"));
dataInPanel.add(nameField);
dataInPanel.add(new JLabel("Enter Birthday as " + PATTERN + ":"));
dataInPanel.add(birthDayField);
dataInPanel.add(new JButton(new AddPersonAction("Add Person", KeyEvent.VK_A)));
return dataInPanel;
}
private class AddPersonAction extends AbstractAction {
public AddPersonAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
String name = nameField.getText();
Date dateOfBirth = (Date) birthDayField.getValue();
Person person = new Person(name, dateOfBirth);
tableModel.addRow(person);
}
}
private class PersonTableModel extends AbstractTableModel {
public final String[] COL_NAMES = {"Name", "Age"};
List<Person> personList = new ArrayList<>();
@Override
public String getColumnName(int column) {
return COL_NAMES[column];
}
@Override
public int getColumnCount() {
return COL_NAMES.length;
}
@Override
public int getRowCount() {
return personList.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex < 0 || rowIndex >= getRowCount()) {
throw new ArrayIndexOutOfBoundsException(rowIndex);
}
if (columnIndex < 0 || columnIndex >= getColumnCount()) {
throw new ArrayIndexOutOfBoundsException(columnIndex);
}
Person person = personList.get(rowIndex);
if (columnIndex == 0) {
return person.getName();
} else if (columnIndex == 1) {
return person.getAge();
}
return null;
}
@Override
public java.lang.Class<?> getColumnClass(int column) {
if (column == 0) {
return String.class;
} else if (column == 1) {
return Integer.class;
} else {
return super.getColumnClass(column);
}
};
public void addRow(Person person) {
personList.add(person);
int firstRow = personList.size() - 1;
fireTableRowsInserted(firstRow, firstRow);
}
}
private static void createAndShowGui() {
BirthdayGui mainPanel = new BirthdayGui();
JFrame frame = new JFrame("ConsoleGuiEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
可能重复[Java运行的一个bash shell脚本](http://stackoverflow.com/questions/13707519/running-a- bash-shell-script-in-java) – StackFlowed 2014-10-07 01:48:20
对不起,但你的代码没有意义,看起来像一个编程“想法的飞行” - 随机编程思想挤在一起。至于你的问题,你说的“运行一个控制台程序”究竟意味着什么?这是一个Java控制台程序吗?它是一种用户通过控制台与程序交互的程序类型吗?如果是这样,从GUI运行它的目的是什么?这些细节将有助于他人更好地理解您的问题。 – 2014-10-07 01:48:33
请编辑您的代码。看起来你粘贴了一个块两次。 – 2014-10-07 01:49:47