Java 如何从新帧调用上一帧,如何重新设置可见?

Java 如何从新帧调用上一帧,如何重新设置可见?,java,eclipse,swing,Java,Eclipse,Swing,我有一个Meni JFrame,我将其设置为不可见,当我调用其他帧时,单击按钮,例如Reports JFrame,现在如何从Reports frame调用相同的帧Meni,而不是新帧 我现在的代码是这样的: 梅尼 现在我想回到我之前设置为不可见的同一个Meni框架,而不是创建一个新的,如何做到这一点,如果可能的话,ofc 报告 JButton btnMeni = new JButton(" Meni"); btnMeni.addActionListener(new ActionLi

我有一个Meni JFrame,我将其设置为不可见,当我调用其他帧时,单击按钮,例如Reports JFrame,现在如何从Reports frame调用相同的帧Meni,而不是新帧

我现在的代码是这样的:

梅尼

现在我想回到我之前设置为不可见的同一个Meni框架,而不是创建一个新的,如何做到这一点,如果可能的话,ofc

报告

 JButton btnMeni = new JButton("   Meni");
    btnMeni.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            //if i do the same like in Meni it will call new window, and 
            //i don't want that i simply want to setVisible Meni window again

            dispose();

        }
    });

谢谢

您可以在“主”框架中添加一个侦听器,以便在报告框架关闭时再次显示框架:

   r.addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowClosing(WindowEvent e)
        {
            setVisible(true);

        }
    });
WindowListener的Java文档:

在您的报告框架中,只需关闭onButton中的窗口单击methode with

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

此处不应使用2帧。改用。下面是一个小示例,说明如何将两个sceen放入单个
JFrame

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.WindowConstants;

public class ScreenUI {

    private static final String FIRST_SCREEN = "first";

    private static final String SECOND_SCREEN = "second";

    public static void main(String[] args) {
        JFrame frame = new JFrame("Multiscreen");
        CardLayout cl = new CardLayout();
        // set card layout
        frame.getContentPane().setLayout(cl);
        // build first screen
        JPanel firstScreen = new JPanel(new BorderLayout());
        firstScreen.add(new JScrollPane(new JList<>(new String[] {"One", "Two", "Three", "Four"})));
        JButton nextScreen = new JButton("Next");
        // action to show second screen, which is referenced per string constant
        nextScreen.addActionListener(e -> cl.show(frame.getContentPane(), SECOND_SCREEN)); 
        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        buttonsPanel.add(nextScreen);
        firstScreen.add(buttonsPanel, BorderLayout.SOUTH);
        frame.getContentPane().add(firstScreen, FIRST_SCREEN);
        // build second screen
        JPanel secondScreen = new JPanel(new BorderLayout());
        secondScreen.add(new JScrollPane(new JTree()));
        JButton previousScreen = new JButton("Previous");
        // action to show first screen, which is referenced per string constant
        previousScreen.addActionListener(e -> cl.show(frame.getContentPane(), FIRST_SCREEN));
        buttonsPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        buttonsPanel.add(previousScreen);
        secondScreen.add(buttonsPanel, BorderLayout.SOUTH);
        frame.getContentPane().add(secondScreen, SECOND_SCREEN);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.FlowLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.WindowConstants;
公共类屏幕界面{
私有静态最终字符串FIRST\u SCREEN=“FIRST”;
私有静态最终字符串SECOND\u SCREEN=“SECOND”;
公共静态void main(字符串[]args){
JFrame=新JFrame(“多屏幕”);
CardLayout cl=新的CardLayout();
//设置卡片布局
frame.getContentPane().setLayout(cl);
//构建第一个屏幕
JPanel firstScreen=newjpanel(newborderlayout());
add(新的JScrollPane(新的JList(新的字符串[]{“一”、“二”、“三”、“四”}));
JButton nextScreen=新JButton(“下一步”);
//显示第二个屏幕的操作,该屏幕根据字符串常量引用
nextScreen.addActionListener(e->cl.show(frame.getContentPane(),第二个屏幕));
JPanel buttonPanel=新的JPanel(新的FlowLayout(FlowLayout.training));
按钮面板添加(下一屏幕);
第一屏。添加(按钮面板,边界布局。南);
frame.getContentPane().add(第一屏,第一屏);
//构建第二个屏幕
JPanel secondScreen=newjpanel(newborderlayout());
add(新的JScrollPane(新的JTree());
JButton previousScreen=新JButton(“先前”);
//显示第一个屏幕的操作,每个字符串常量引用该屏幕
addActionListener(e->cl.show(frame.getContentPane(),第一个屏幕));
buttonsPanel=新的JPanel(新的FlowLayout(FlowLayout.training));
按钮面板添加(上一屏幕);
第二屏。添加(按钮面板,边界布局。南);
frame.getContentPane().add(第二屏,第二屏);
框架。设置尺寸(400300);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

据我所知,您有不同的JFrame?也许你可以看看这里的第一个可能的重复,你的问题本质上是,“我如何调用一个方法(here
.setVisible(true)
)在另一个对象上,关键是在需要它的地方有一个对该对象的引用。如何做到这一点取决于代码的结构。但是说了这一点,是的,正如@pL4Gu33所指出的,您的用户可能会对JFrames以这种方式对其进行攻击感到非常恼火。不要这样做,而是使用
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.WindowConstants;

public class ScreenUI {

    private static final String FIRST_SCREEN = "first";

    private static final String SECOND_SCREEN = "second";

    public static void main(String[] args) {
        JFrame frame = new JFrame("Multiscreen");
        CardLayout cl = new CardLayout();
        // set card layout
        frame.getContentPane().setLayout(cl);
        // build first screen
        JPanel firstScreen = new JPanel(new BorderLayout());
        firstScreen.add(new JScrollPane(new JList<>(new String[] {"One", "Two", "Three", "Four"})));
        JButton nextScreen = new JButton("Next");
        // action to show second screen, which is referenced per string constant
        nextScreen.addActionListener(e -> cl.show(frame.getContentPane(), SECOND_SCREEN)); 
        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        buttonsPanel.add(nextScreen);
        firstScreen.add(buttonsPanel, BorderLayout.SOUTH);
        frame.getContentPane().add(firstScreen, FIRST_SCREEN);
        // build second screen
        JPanel secondScreen = new JPanel(new BorderLayout());
        secondScreen.add(new JScrollPane(new JTree()));
        JButton previousScreen = new JButton("Previous");
        // action to show first screen, which is referenced per string constant
        previousScreen.addActionListener(e -> cl.show(frame.getContentPane(), FIRST_SCREEN));
        buttonsPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        buttonsPanel.add(previousScreen);
        secondScreen.add(buttonsPanel, BorderLayout.SOUTH);
        frame.getContentPane().add(secondScreen, SECOND_SCREEN);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}