如何让 JFrame 关闭外部 window?
How can I make JFrame close a external window?
我想知道是否有人知道如何让 JFrame 关闭外部 window。例如 .bat 文件。我的 GUI window 看起来像这样,
( https://cdn.discordapp.com/attachments/339245512647770112/372569903070183425/unknown.png )
我想在它说 "Close" 的地方关闭我用 "Run" 按钮打开的文件。
btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 20));
btnNewButton.setBounds(375, 190, 120, 40);
frame.getContentPane().add(btnNewButton);
JButton btnStart = new JButton("Run");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().open(new File("C:\Users\User\Desktop\Discord-Selfbot-master\self-bot.bat"));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
});
是否可以使用相同或相似的代码关闭文件?如果您有任何关于此的信息,那么我很乐意听到。
感谢您的时间和考虑。
-Brand0n
您可以使用 ProcessBuilder 来启动您的程序。然后可以使用返回的进程来终止程序。
这是完整的工作代码
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import javax.swing.*;
public class TestFrame {
public static void testWithoutUI(String s[]) {
ProgramRunner programRunner = new ProgramRunner("notepad.exe");
programRunner.start();
System.out.println("waiting");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
programRunner.getProcess().destroyForcibly();
System.out.println("done");
}
public static void main(String s[]) {
JFrame frame = new JFrame("JFrame Example");
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JLabel label = new JLabel("Self-Bot");
ProgramRunner programRunner = new ProgramRunner("notepad.exe");//C:\Users\User\Desktop\Discord-Selfbot-master\self-bot.bat
JButton btnStart = new JButton("Run");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
programRunner.start();
}
});
JButton buttonClose = new JButton();
buttonClose.setText("close");
buttonClose.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
programRunner.getProcess().destroyForcibly();
}
});
panel.add(label);
panel.add(btnStart);
panel.add(buttonClose);
frame.add(panel);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ProgramRunner extends Thread{
private String pathToFile = null;
private Process process = null;
public ProgramRunner(String pathToFile) {
this.pathToFile = pathToFile;
}
@Override
public void run() {
try {
startProgram();
} catch (IOException e) {
e.printStackTrace();
}
}
private void startProgram() throws IOException {
process = new ProcessBuilder(pathToFile).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
public Process getProcess() {
return process;
}
}
我想知道是否有人知道如何让 JFrame 关闭外部 window。例如 .bat 文件。我的 GUI window 看起来像这样, ( https://cdn.discordapp.com/attachments/339245512647770112/372569903070183425/unknown.png ) 我想在它说 "Close" 的地方关闭我用 "Run" 按钮打开的文件。
btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 20));
btnNewButton.setBounds(375, 190, 120, 40);
frame.getContentPane().add(btnNewButton);
JButton btnStart = new JButton("Run");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Desktop.getDesktop().open(new File("C:\Users\User\Desktop\Discord-Selfbot-master\self-bot.bat"));
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
});
是否可以使用相同或相似的代码关闭文件?如果您有任何关于此的信息,那么我很乐意听到。
感谢您的时间和考虑。 -Brand0n
您可以使用 ProcessBuilder 来启动您的程序。然后可以使用返回的进程来终止程序。
这是完整的工作代码
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import javax.swing.*;
public class TestFrame {
public static void testWithoutUI(String s[]) {
ProgramRunner programRunner = new ProgramRunner("notepad.exe");
programRunner.start();
System.out.println("waiting");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
programRunner.getProcess().destroyForcibly();
System.out.println("done");
}
public static void main(String s[]) {
JFrame frame = new JFrame("JFrame Example");
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JLabel label = new JLabel("Self-Bot");
ProgramRunner programRunner = new ProgramRunner("notepad.exe");//C:\Users\User\Desktop\Discord-Selfbot-master\self-bot.bat
JButton btnStart = new JButton("Run");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnStart.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
programRunner.start();
}
});
JButton buttonClose = new JButton();
buttonClose.setText("close");
buttonClose.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
programRunner.getProcess().destroyForcibly();
}
});
panel.add(label);
panel.add(btnStart);
panel.add(buttonClose);
frame.add(panel);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ProgramRunner extends Thread{
private String pathToFile = null;
private Process process = null;
public ProgramRunner(String pathToFile) {
this.pathToFile = pathToFile;
}
@Override
public void run() {
try {
startProgram();
} catch (IOException e) {
e.printStackTrace();
}
}
private void startProgram() throws IOException {
process = new ProcessBuilder(pathToFile).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
public Process getProcess() {
return process;
}
}