Как удалить открытый Jframe из другого

Привет, мне было интересно, как удалить jFrame из другого, потому что я хочу создать новый экземпляр этого класса с новыми значениями в его текстовых полях, поэтому первый jFrame таков:

public class Frame1 extends javax.swing.JFrame implements ActionListener {
    Frame2 f;
    public Frame1() {
        initComponents();
        this.setLocationRelativeTo(null);
    }
    private void rbtnShowFrame2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        f = new Frame2();
        f.setVisible(true);
    }
    public void actionPerformed(ActionEvent e) {
        this.dispose(); //I TRIED TO DISPOSING IT HERE BUT DOESN'T WORK
    }
}

Итак, я хочу в другом jFrame удалить jFrame1 только в том случае, если я инициирую действие события, выполняемое боттоном, если этого не произойдет, я не хочу его удалять, я не знаю, могу ли я сделать это с помощью ActionListener, это второй jFrame:

public class Frame2 extends javax.swing.JFrame {
    public Frame2() {
        initComponents();
        this.setLocationRelativeTo(null);
        Frame1 f1 = new Frame1();
        this.cmdOk.addActionListener(cGUI);
    }
    private void cmdOkActionPerformed(java.awt.event.ActionEvent evt) {                                         
        //Here is where i want to dispose() the other jFrame1
        //to create a new instance and pass the value using public static jTextFields
        f1.labelNumeroCotizacion.setText(this.labelNumCotizacionEnviar.getText());
        f1.setVisible(true);
    }
} 

Извините за мой код, я новичок в использовании ООП! спасибо всем ребята....


person Mario    schedule 28.02.2014    source источник
comment
Примечание: вы действительно хотите заменить один кадр другим? А как насчет замены панели внутри? Или, если речь идет только о значениях текстового поля, как насчет вызова методов set для полей в вашем фрейме.   -  person Stroboskop    schedule 28.02.2014
comment
я просто очень хочу изменить значения в jTextFields, но я не знаю, смогу ли я сделать это только с помощью сеттеров и геттеров, потому что единственный способ, который я обнаружил, - это использовать новый экземпляр, но я не знаю, можете ли вы помочь мне принести мне другую идею, спасибо за ваш ответ!   -  person Mario    schedule 28.02.2014
comment
Сделайте переменные-члены ваших текстовых полей в Frame1. Затем дайте Frame1 либо метод set для каждого из полей, которые будут вызывать field.setText(text), либо дайте фрейму один большой метод setData с составным объектом, содержащим все значения в качестве членов.   -  person Stroboskop    schedule 28.02.2014
comment
Хорошо, я понимаю, проблема в том, что мне нужно создать экземпляр из другого класса, чтобы выполнить геттеры и сеттеры jTextFields, поэтому мне нужно создать новый объект, и я не могу передать значения более ранним jFrame...   -  person Mario    schedule 28.02.2014
comment
В любом случае вам нужно будет сохранить ссылку на ваш экземпляр Frame1 в Frame2. Это то же самое, что и для желания избавиться от него или для использования сеттеров. Посмотрите на код Awefully Awesome. Он передает экземпляр FrameA конструктору FrameB.   -  person Stroboskop    schedule 28.02.2014
comment
1) См. Использование нескольких JFrames, хорошая/плохая практика? 2) Для многих компонентов в одном пространстве используйте < a href="http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html" rel="nofollow noreferrer">CardLayout, как показано в этом краткий пример.   -  person Andrew Thompson    schedule 01.03.2014


Ответы (1)


Вот пример того, как удалить JFrame из другого JFrame:

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Demo
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        FrameA one = new FrameA();
        FrameB two = new FrameB(one);

        one.setVisible(true);
        two.setVisible(true);
      }
    });
  }
}

class FrameA extends JFrame
{
  private static final long serialVersionUID = 1812279930292019387L;

  public FrameA()
  {
    super("Frame A");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 400);
    setLocationRelativeTo(null);

    setResizable(false);
  }
}

class FrameB extends JFrame
{
  private static final long serialVersionUID = 5126089271972476434L;

  public FrameB(final JFrame otherFrame)
  {
    super("Frame B");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 400);
    setLayout(new GridBagLayout());
    setLocationRelativeTo(otherFrame);

    JButton button = new JButton("Dispose Other");
    button.addActionListener(new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent e)
      {
        otherFrame.dispose();
      }
    });

    add(button);

    setResizable(false);
  }
}
person Aman Agnihotri    schedule 28.02.2014
comment
Круто, и если на ваш вопрос отвечает этот вопрос, то примите его, чтобы закрыть вопрос. Или задайте любые дополнительные сомнения в разделе комментариев, если они у вас есть. - person Aman Agnihotri; 28.02.2014
comment
Послушайте, я не знаю, куда поместить этот код, в моем случае я хочу закрыть jFrame1 в кнопке jFrame2, так что вы можете дать мне ключ, как поместить этот код в мой? потому что я уже пытался, но я не могу сделать это! - person Mario; 28.02.2014
comment
Если вы снова видите мой код, значит FrameA закрывается нажатием кнопки, которая присутствует в FrameB. Вы добавляете actionListener к button, а затем вызываете метод dispose для jFrame1. Вам нужно передать ссылку jFrame1 в ваш класс jFrame2, чтобы он мог использовать ее в методе actionPerformed класса button. - person Aman Agnihotri; 28.02.2014
comment
Скопируйте и вставьте мой код в свою IDE, скомпилируйте и запустите его, чтобы получить представление. - person Aman Agnihotri; 28.02.2014
comment
Рад, что смог помочь. :) - person Aman Agnihotri; 28.02.2014