Java 如何从新帧调用上一帧,如何重新设置可见?
我有一个Meni JFrame,我将其设置为不可见,当我调用其他帧时,单击按钮,例如Reports JFrame,现在如何从Reports frame调用相同的帧Meni,而不是新帧 我现在的代码是这样的: 梅尼 现在我想回到我之前设置为不可见的同一个Meni框架,而不是创建一个新的,如何做到这一点,如果可能的话,ofc 报告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
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);
}
}