Простой вопрос GUI в Java - PullRequest
1 голос
/ 16 марта 2011

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

Таким образом, у меня есть 3 кнопки: button1 = кнопка gmail2 = кнопка google3 = 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) {}


}

Спасибо

Ответы [ 6 ]

4 голосов
/ 16 марта 2011

Ваше действие выполняется всеми тремя.Вам нужно использовать 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);
    }
}
3 голосов
/ 16 марта 2011

Вы добавляете одинаковый ActionListener для всех трех кнопок. И в ACtionListener вы открываете Yahoo Google и Gmail. Так чего еще ты ожидал?

Если ваш метод actionPerformed не отличается от того, какая кнопка была нажата, то это правильное поведение.

Существуют различные возможности для решения этой проблемы ... используйте ACtionListener для каждой кнопки (например, анонимный)

Или используйте e.getSource(), чтобы определить, какая кнопка была нажата в методе actionPerformed.

Например:

if(e.getSource().equals(a)) {
   address = "https://mail.google.com";
}
2 голосов
/ 16 марта 2011

Вы не идентифицируете каждую кнопку в своем действии actionPerformed.

Каждый раз, когда событие выполняется, все три команды выполняются

1 голос
/ 16 марта 2011

Можно рассмотреть вопрос о присвоении имени a a gmail, чтобы оно было более наглядным.

  a.addActionListener(new ActionListener() {
     void actionPerformed(ActionEvent e) {
        p1 = Runtime.getRuntime().exec("cmd /c start https://mail.google.com");
     }
  });

Но вкратце все три.

0 голосов
/ 16 марта 2011

Вы также можете попробовать установить 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);
    }
}
0 голосов
/ 16 марта 2011

Если вы хотите сделать три разные вещи, вам нужно либо три разных слушателя действия (по одному для каждой кнопки), каждый из которых выполняет одно действие, либо один слушатель действия (один для всех кнопок), который пытается определить, какая кнопка была нажал и делает что-то в зависимости от того, какая кнопка его назвала.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...