我有两个java文件(类)PMotion.java和Menu.java。
Menu.java有一个按钮。当我按下该按钮时,我希望它处理当前的Menu.java框架并转到PMotion.java类。正如您在Menu.java文件中看到的那样,我有
new PMotion().setVisible(true);
frame.dispose();
frame.dispose();工作,因为它关闭Menu.java。但它不是打开PMotion.java,而是打开一个空白的JFrame。请注意:我只复制了PMotion.java中的相关代码 - 实际上,它是一个完全正常工作的应用程序。感谢帮助!
PMotion.java
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.JTextArea;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JSeparator;
import javax.swing.JScrollBar;
public class PMotion extends JFrame {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PMotion window = new PMotion();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public PMotion() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame("Projectile Motion");
frame.setBounds(100, 100, 800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setResizable(false);
Menu.java
JButton btnProjectile = new JButton("Projectile");
btnProjectile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new PMotion().setVisible(true);
frame.dispose();
}
});
btnProjectile.setBounds(260, 137, 117, 29);
frame.getContentPane().add(btnProjectile);
}
}
答案 0 :(得分:2)
为什么你的类扩展JFrame然后在构造函数中创建一个新的JFrame?
你要么:
但你不同时做这两件事。
//frame = new JFrame("Projectile Motion");
frame = this;
在您的情况下,您可以使用上面的代码,因为PMotion已经是JFrame。
答案 1 :(得分:2)
我只复制了PMotion.java中的相关代码 - 实际上,它是一个完全正常运行的应用程序。
虽然不足以完全回答而且没有猜测,并且将来,您将要创建并发布有效的minimal example program(请阅读链接 - 如果您和#这很重要39;将在本网站上提出未来的问题),但是在浏览一下您发布的一小段代码时,您的PMotion类在创建时会创建两个 JFrame,其中一个是PMotion类,你正在显示,以及一个单独的JFrame,它在 的PMotion课程中,一个你没有显示的,我猜你是'将一些(大多数)GUI组件放入这个单独的JFrame中。
解决方案1:简化!让PMotion扩展JFrame并让它保存GUI组件,并摆脱它所持有的次要不必要的JFrame。
更好的解决方案:您正在通过扩展JFrame的类绘制自己,迫使您创建和显示JFrame,这通常需要更多的灵活性。事实上,我冒昧地说,我已经创建的大部分Swing GUI代码都是不扩展JFrame,事实上你很少&#39 ;我会想要这样做。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。而是使用CardLayout创建JPanels和交换视图。有关其重要性的更多信息,请参阅The Use of Multiple JFrames, Good/Bad Practice?
单独的问题:frame.getContentPane().setLayout(null);
。请不要这样做。虽然null布局和setBounds()
似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,你在使用它们时会遇到更严重的困难。 。当GUI调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。