更新:我认为目前最简单的事情就是使用单独的JPane而不是JFrame用于子菜单。我将它们全部组合在一起并将其他组件设置为不可见,并以此方式切换。菜单不是那么复杂,这太麻烦了。
我正在创建一个GUI,通过另一个按钮点击打开另一个JFrame窗口。我只是不确定在单击其中一个按钮时关闭主窗口的正确方法,但不是关闭整个程序。我也不确定如何让第二个窗口可见(我从另一个例子尝试的代码行不能正常工作)。提出的第二个框架将为用户提供做事的选项,并且实际上会调用另一个程序/类来运行在其中单击的按钮(其中一个选项的结果是一个长程序,所以我想我需要运行它在另一个线程上。)程序运行完毕后,用户可以选择返回主菜单,关闭第二个菜单(并将其关闭),或退出程序(从而终止主菜单并清理所有内容)。从主菜单中,他们还可以选择关闭程序,清理所有内容。这就是我到目前为止所做的:
主GUI:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class GUIMain implements ActionListener {
GUIMain(){
JFrame jFrm = new JFrame("Data Mining Application");
jFrm.setSize(800,600);
jFrm.setLayout(new BorderLayout());
jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
prepareGUI(jFrm.getContentPane());
jFrm.pack();
jFrm.setVisible(true);
}
private void prepareGUI(final Container pane){
JPanel mainPanel = new JPanel(new GridLayout(3,2,50,50));
JButton b1 = new JButton("Pre-processing");
b1.addActionListener(this);
mainPanel.add(b1);
pane.add(mainPanel,BorderLayout.CENTER);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GUIMain();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()){
case "Pre-processing":
PreProcessingGUI window = new PreProcessingGUI();
window.getFrame.setVisible(true); //not working
break;
// etc
default:
break;
}
}
}
调用的类和JFrame:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PreProcessingGUI implements ActionListener {
PreProcessingGUI(){
JFrame jFrm = new JFrame("Pre-processing");
jFrm.setSize(800,600);
jFrm.setLayout(new BorderLayout());
jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
prepareGUI(jFrm.getContentPane());
jFrm.pack();
}
private void prepareGUI(final Container pane) {
//do stuff
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PreProcessingGUI window = new PreProcessingGUI();
// Not surewhat to do here either as the program is not recognising the getFrame method
//window.getFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
// do stuff
}
}
答案 0 :(得分:0)
我对Swing的工作不多,但我可以帮助你一点:
当您尝试在GUIMain.actionPerformed
中显示第二个窗口时,您似乎尝试使用具有方法(getFrame
)的公共变量来获取框架。
window.getFrame.setVisible(true);
此变量不存在!它没有在任何地方定义。这里没有魔力!
您应该在getFrame()
中实施PreProcessingGUI
方法,并将其用于代替您的变量。
在GUIMain.actionPerformed
:
window.getFrame().setVisible(true);
在PreProcessingGUI
public class PreProcessingGUI implements ActionListener {
private JFrame jFrm; //You asssing is as you the constructor
PreProcessingGUI(){
jFrm = new JFrame("Pre-processing");
...
}
public getFrame(){
return jFrm;
}
...
除此之外,我会说你应该考虑使用JDialog(并且可选择使其成为模态)而不是JFrame
。