我在java中尝试一个非常简单的GUI。 我刚刚创建了一个带按钮的小GUI,当我们点击每个按钮时,它会打开一个网站。
所以我有3个按钮: button1 = gmail button2 =谷歌 button3 = yahoo
当我点击button1时,它会打开gmail或google或yahoo。 其他按钮也存在同样的问题。
为什么?
这是我非常简单的代码:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Gui extends Frame implements WindowListener,ActionListener {
//TextField text = new TextField(20);
Button a, b, c;
Process p1, p2, p3;
//private int numClicks = 0;
public static void main(String[] args) {
Gui myWindow = new Gui("Miquelon's");
myWindow.setSize(350,100);
myWindow.setVisible(true);
}
public Gui(String title) {
super(title);
setLayout(new FlowLayout());
addWindowListener(this);
a = new Button("Gmail");
b = new Button ("Google");
c = new Button ("Yahooooo");
add(a);
add(b);
add(c);
//add(text);
a.addActionListener(this);
b.addActionListener(this);
c.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
try
{
{
p1 = Runtime.getRuntime().exec("cmd /c start https://mail.google.com");
p2 = Runtime.getRuntime().exec("cmd /c start https://google.com");
p3 = Runtime.getRuntime().exec("cmd /c start https://yahoo.com");
}
}
catch (IOException ex)
{
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
}
谢谢
答案 0 :(得分:4)
你的actionPerformed正在运行这三个。您需要使用actionPerformed来确定按下了哪个按钮,然后运行相应的命令。
public void actionPerformed(ActionEvent e)
{
String address = "";
if(e.getSource() == a) address = "https://mail.google.com";
else if(e.getSource() == b) address = "https://google.com";
else if(e.getSource() == c) address = "https://yahoo.com";
else return; // not one of the three buttons, get out!
try
{
// only NEED to store the process if you want to do something with it later
// I just let mine dangle :) it works for me!
Runtime.getRuntime().exec("cmd /c start " + address);
}
catch (IOException ex)
{
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 1 :(得分:3)
将相同的ActionListener添加到所有三个按钮。在ACtionListener中,你打开雅虎谷歌和Gmail。那么你还期待什么?
如果你的actionPerformed方法没有按下哪个按钮,那么这是正确的行为。
解决此问题有多种可能性...为每个按钮使用ACtionListener(例如anonymoous)
或使用e.getSource()
确定actionPerformed方法中按下了哪个按钮。
例如:
if(e.getSource().equals(a)) {
address = "https://mail.google.com";
}
答案 2 :(得分:2)
您无法识别actionPerformed事件中的每个按钮。
每次执行事件时,都会执行所有三个命令
答案 3 :(得分:1)
考虑将你的a命名为gmail,使其更具描述性。
a.addActionListener(new ActionListener() {
void actionPerformed(ActionEvent e) {
p1 = Runtime.getRuntime().exec("cmd /c start https://mail.google.com");
}
});
但总之,它正在全部运行。
答案 4 :(得分:0)
如果你想做三件不同的事情,你需要三个不同的动作监听器(每个按钮一个),每个动作监听器做一件事,或者一个动作监听器(一个用于所有按钮),它试图确定哪个按钮是按下并按照哪个按钮调用它来做某事。
你现在拥有的是一个动作监听器,可以完成所有三件事情,而不必考虑按下哪个按钮。
答案 5 :(得分:0)
您还可以尝试为每个按钮设置ActionCommand,以便它们都可以使用相同的事件侦听器。如果/当您想要添加新按钮时,这也可以提高可维护性。
a = new Button("Gmail");
a.setActionCommand( "https://gmail.com" );
b = new Button ("Google");
b.setActionCommand( "https://google.com" );
c = new Button ("Yahooooo");
c.setActionCommand( "https://yahoo.com" );
并重新实现您的侦听器方法:
public void actionPerformed(ActionEvent e)
{
try
{
{
Runtime.getRuntime().exec("cmd /c start " + e.getActionEvent());
}
}
catch (IOException ex)
{
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}