Закройте один кадр (не все приложение) с помощью AWT - PullRequest
4 голосов
/ 14 ноября 2011

При нажатии, как закрыть только одно Frame не оба или целое приложение?(Я также пробовал с отправкой событий AWT, EDT)

package test;

import java.awt.*;
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;

public class Test11 extends Frame implements MouseListener
{
  public static Frame gp;  
  public Test11()
  { 
    try {            
       this.setLayout (new BorderLayout ());
       Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
       this.setBounds(screen.width-400,33,400, 400);   
       this.setBackground(Color.red);
       this.addWindowListener(new WindowAdapter()
       {
         public void windowClosing(WindowEvent we) 
         {
           System.exit(0);
         }
       });       
       this.addMouseListener(this);       
       this.setVisible(true);
    } finally {
    }    
  }

  /* How do i do AWT Event Dispatch (EDT): to cloase AWT window? */
  public static void main(String[] args) throws InterruptedException, InvocationTargetException 
  {
    /* EDT: AWT Event Dispatch
    EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
    eventQueue.push(new MyEventQueue()); */

    /* Simple close */
    EventQueue.invokeAndWait(new Runnable() 
    {
      public void run() 
      {
        System.out.println("Run: Window 1");
        gp = new Test11();
        gp.setVisible(true);      
        //gp.setVisible(false);
      }
    });

    /* Simple close */
    EventQueue.invokeAndWait(new Runnable() 
    {
      public void run() 
      {
        System.out.println("Run: Window 2");
        new Test11().setVisible(true);
      }
    });

  }

  @Override
  public void mouseClicked(MouseEvent me) 
  {
    System.out.println("Clicked: out of Window1 or Window2, close only any one not whole application");
    System.exit(0);
  }

  @Override
  public void mousePressed(MouseEvent me) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void mouseReleased(MouseEvent me) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void mouseEntered(MouseEvent me) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public void mouseExited(MouseEvent me) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  /* EDT: Extended class
  private static class MyEventQueue extends EventQueue 
  {
    public void postEvent(AWTEvent theEvent) 
    {
      System.out.println("Event Posted"); 
      super.postEvent(theEvent);
    }
  }
  */  
}

Продолжение:

import java.awt.*;
import java.awt.event.*;

public class Test11 extends Frame 
{
    public static Frame window1;
    public static Frame window2;

    public Test11(String title) {
        super(title);
        setSize(400, 400);
        setBackground(Color.red);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.out.println(
                    getTitle() +
                    " says Bye-Bye!  " +
                    new java.util.Date());
                dispose();
            }
        });
        setLocationByPlatform(true);
    }

    public static void main(String[] args) {
        /* AFAIU starting the GUI on the EDT only applies to Swing.*/
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                System.out.println("Run: Window 1");
                window1 = new Test11("Window 1");
                window1.setVisible(true);

                System.out.println("Run: Window 2");
                window2 = new Test11("Window 2"); 
                window2.setVisible(true);
            }
        });

        /* Remotely: i need to close thi window, not manually */
        window2.setVisible(false);
        /* failed then try */
        window2.dispose();

        /* Now: I should have only Window1, but that i am not able to make yet */
    }
}

Ответы [ 4 ]

5 голосов
/ 14 ноября 2011
import java.awt.*;
import java.awt.event.*;

public class Test11 extends Frame {

    public Test11(String title) {
        super(title);
        setSize(400, 400);
        setBackground(Color.red);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.out.println(
                    getTitle() +
                    " says Bye-Bye!  " +
                    new java.util.Date());
                dispose();
            }
        });
        setLocationByPlatform(true);
    }

    public static void main(String[] args) {
        /* AFAIU starting the GUI on the EDT only applies to Swing.*/
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                System.out.println("Run: Window 1");
                (new Test11("Window 1")).setVisible(true);
                System.out.println("Run: Window 2");
                (new Test11("Window 2")).setVisible(true);
            }
        });
    }
}

Типичный выход

Run: Window 1
Run: Window 2
Window 1 says Bye-Bye!  Mon Nov 14 10:20:25 EST 2011
Window 2 says Bye-Bye!  Mon Nov 14 10:20:35 EST 2011
Press any key to continue . . .

Обновление 1

Этот код закрывает "Окно 2" программно. Проблема с вашей версией заключалась в «синхронизации», вызванной вызовом для вызова позже (как вы думаете, что это значит?). Это можно исправить одним из двух относительно простых способов.

  1. Кладж. Добавьте Swing Timer / ActionListener, настроенный на отключение через 2 секунды после основного запуска. Для этого маршрута удалите «часть комментария» из всех закомментированных строк кода в главном.
  2. Лучшее решение. Удалите вызов на EventQueue.invokeLater(), который не имеет отношения к компонентам AWT.

Вот измененный код:

import java.awt.*;
import java.awt.event.*;
// since the OP has not taken the time to explain 'why AWT',
// I choose to make life easy by using a Swing class.
import javax.swing.Timer;

public class Test11 extends Frame
{
    public static Frame window1;
    public static Frame window2;

    public Test11(String title) {
        super(title);
        setSize(400, 400);
        setBackground(Color.red);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.out.println(
                    getTitle() +
                    " says Bye-Bye!  " +
                    new java.util.Date());
                dispose();
            }
        });
        setLocationByPlatform(true);
    }

    public static void main(String[] args) {
        // AFAIU starting the GUI on the EDT only applies to Swing.
        //EventQueue.invokeLater(new Runnable() {
        //    public void run() {
                System.out.println("Run: Window 1");
                window1 = new Test11("Window 1");
                window1.setVisible(true);

                System.out.println("Run: Window 2");
                window2 = new Test11("Window 2");
                window2.setVisible(true);
        //    }
        //});

        //ActionListener closeWindow = new ActionListener(){
        //  public void actionPerformed(ActionEvent ae) {
                System.out.println(
                    window2.getTitle() +
                    " says Bye-Bye!  " +
                    new java.util.Date());
                /* failed then try */
                window2.dispose();
        //  }
        //};
        //Timer timer = new Timer(2000,closeWindow);
        //timer.setRepeats(false);
        //timer.start();
    }
}
3 голосов
/ 14 ноября 2011

Посмотрите на setDefaultCloseOperation () : HIDE_ON_CLOSE - правильный атрибут для этого поведения, эти методы допустимы для Swing,

РЕДАКТИРОВАТЬ:

если вы хотите повторно использовать этот / эти контейнеры,

this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent we) {
        this.setVisible(false);
    }
});
2 голосов
/ 21 апреля 2015

Самым простым способом для этого является использование:

dispose();

Это просто закрывает окно, связанное с файлом, если оно помещено в onClickListener. Это не завершает всю программу.

0 голосов
/ 19 апреля 2016

в режиме разработки вы должны перейти к свойствам jframe, щелкнув правой кнопкой мыши и выбрав: DISPOSE в строке defaultcloseoperation (обычно это первая строка).

все эти операции проще в разработке.Я говорю о netbeans, но я надеюсь, что это похоже на другой идеал.

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