Как заставить JButton запускать исполняемый файл в том же каталоге?

java swing jbutton processbuilder

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 для получения более подробной информации

Посмотри на

для большего количества примеров ...

Автор: MadProgrammer Размещён: 07.10.2014 01:47

2 плюса

Я говорю о том, что вам следует рассмотреть возможность извлечения базовой логики и данных из вашей консольной программы для создания модельного класса или классов, а затем использовать их в вашей консольной программе или в графическом интерфейсе.

Например, скажем, у вас была простая консольная программа, которая получила от кого-то имя и дату рождения:

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 плюса

Вы должны сделать следующее:

  1. Создайте ActionListenerи переопределите методactionPerformed
  2. Вызовите метод Runtime.getRuntime().exec()переопределенного действия.
  3. Установите на ActionListenerсвою кнопку, позвонивbutton.setActionListener()
Автор: user3049021 Размещён: 07.10.2014 01:52
Вопросы из категории :
32x32