【问题标题】:How to Dispose an opened Jframe from Other如何处理从其他打开的 Jframe
【发布时间】:2014-02-28 14:23:49
【问题描述】:

您好,我想知道如何处理另一个 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);
    }
} 

对不起我的代码,我是使用 OOP 的新手!谢谢大家....

【问题讨论】:

  • 旁注:您真的想用另一个框架替换一个框架吗?只是更换里面的面板怎么样?或者,如果它只是关于文本字段值,那么如何在框架中的字段上调用 ​​set 方法。
  • 我真的很想更改 jTextFields 中的值,但我不知道我是否只能使用 setter 和 getter 来做到这一点,因为我发现的唯一方法是使用新实例,但我不知道你能不能帮我给我带来另一个想法,谢谢你的回答!
  • 在 Frame1 中创建文本字段的成员变量。然后为 Frame1 为每个将调用 field.setText(text) 的字段提供一个 set 方法,或者为框架提供一个大的 setData 方法,其中包含一个包含所有值作为成员的复合对象。
  • 好的,我明白了,我遇到的问题是我必须从另一个类创建一个实例,来执行 jTextFields 的 getter 和 setter,所以我必须创建一个新对象,并且我无法将值传递给较早的 jFrame...
  • 无论哪种方式,您都需要在 Frame2 中保留对 Frame1 实例的引用。想要处理它或使用 setter 是一样的。看看 Awefully Awesome 的代码。他将 FrameA 的实例传递给 FrameB 的构造函数。

标签: java swing oop actionlistener


【解决方案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);
  }
}

【讨论】:

  • 很酷,如果此问题回答了您的问题,则接受它以关闭问题。或者如果您有任何疑问,请在 cmets 部分询问。
  • 看,我不知道该把代码放在哪里,在我的情况下,我想在 jFrame2 的按钮中关闭 jFrame1,所以你能告诉我如何把那个代码放入我的吗?因为我已经试过了,但我做不到!
  • 如果您再次看到我的代码,那么在单击 FrameB 中的按钮时,FrameA 将被关闭。您将actionListener 添加到button,然后在jFrame1 上调用dispose 方法。您需要将jFrame1 的引用传递给您的jFrame2 类,以便它可以在buttonactionPerformed 方法中使用它。
  • 复制粘贴我的代码到你的 IDE 中编译并运行它来得到这个想法。
  • 很高兴我能帮上忙。 :)
猜你喜欢
  • 2015-08-03
  • 2013-06-12
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多