Как заставить JButton запускать исполняемый файл в том же каталоге?
1090 просмотра
3 ответа
Хорошо, я пытаюсь заставить мой JButton запускать исполняемый файл в другом каталоге. Это предыдущее консольное приложение, которое я написал, и я хочу, чтобы эта кнопка запускала исполняемый файл. Я довольно плохо знаком с языком программирования Java, но вот мой код.
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
public class main
{
public static void main(final String[] args) throws IOException {
JFrame f = new JFrame("Test");
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500, 500);
JPanel p = new JPanel();
JButton b1 = new JButton("Calculate");
f.add(p);
p.add(b1);
Process proce = Runtime.getRuntime().exec("C:/Ctest.exe");
}
private static void test1() {
// TODO Auto-generated method stub
}
{
JFrame f = new JFrame("Test");
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500, 500);
JPanel p = new JPanel();
JButton b1 = new JButton("Calculate");
f.add(p);
p.add(b1);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
}
});
}
}
Также, если у вас есть какие-либо советы для меня, пожалуйста, не стесняйтесь рассказать мне их. Я использую Eclipse IDE.
Автор: Groax Источник Размещён: 12.11.2019 09:13Ответы (3)
3 плюса
Начните с рассмотрения ProcessBuilder
.
Swing является однопоточным фреймворком, поэтому вам не нужно запускать Process
в текущем контексте потока диспетчеризации событий (в котором actionPerformed
вызывается), и вам нужно будет выполнить его в своем собственном контексте потока.
Это поднимает проблему синхронизации результатов от Process
обратного интерфейса до пользовательского интерфейса, что должно быть когда-либо сделано только в контексте EDT. Для этого вам следует рассмотреть возможность использованияSwingWorker
Взгляните на параллелизм в Swing и рабочих потоках и SwingWorker для получения более подробной информации
Посмотри на
- Печать Java InputStream из процесса
- Сообщение Swing не отображается до тех пор, пока Runtime.getRuntime (). Exec () не завершит выполнение.
- Включение кнопок при выполнении файла .bat
для большего количества примеров ...
Автор: MadProgrammer Размещён: 07.10.2014 01:472 плюса
Я говорю о том, что вам следует рассмотреть возможность извлечения базовой логики и данных из вашей консольной программы для создания модельного класса или классов, а затем использовать их в вашей консольной программе или в графическом интерфейсе.
Например, скажем, у вас была простая консольная программа, которая получила от кого-то имя и дату рождения:
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);
}
}
Первое, что я хотел бы сделать, это извлечь ключевую информацию и логику из этой программы и создать класс, скажем, с именем Person, который содержит имя String, поле DateOfBirth Date и метод 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;
}
}
и теперь вы можете создать консольную программу, которая использует Person:
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:
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();
}
});
}
}
Автор: Hovercraft Full Of Eels
Размещён: 07.10.2014 03:13
-1 плюса
Вы должны сделать следующее:
- Создайте
ActionListener
и переопределите методactionPerformed
- Вызовите метод
Runtime.getRuntime().exec()
переопределенного действия. - Установите на
ActionListener
свою кнопку, позвонивbutton.setActionListener()
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- swing Java Swing: отображение изображений внутри Jar
- swing Как реализовать перетаскиваемые вкладки с помощью Java Swing?
- swing Можно ли отобразить компоненты Swing в JSP?
- swing Как добавить ActionListener в JButton в Java
- swing "Всегда сверху" Windows с Java
- jbutton Как получить цвет фона JButton по умолчанию?
- jbutton Почему setPreferredSize не меняет размер кнопки?
- jbutton Java / Swing: низкопрофильная высота кнопки?
- jbutton Как сохранить пользовательские настройки предпочтений в Java?
- processbuilder Запустите исполняемый файл в Jar с ProcessBuilder
- processbuilder Как получить PID процесса, который я только начал в java-программе?
- processbuilder Java ProcessBuilder для запуска выполнения нескольких команд последовательно в Linux
- processbuilder ProcessBuilder: пересылка stdout и stderr запущенных процессов без блокировки основного потока
- processbuilder Process Builder не может найти указанный путь, используя папку AppData