为什么JButton打开一个空框而不是调用PMotion类?

时间:2016-10-28 02:55:05

标签: java swing windowbuilder

我有两个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);
    }
}

2 个答案:

答案 0 :(得分:2)

为什么你的类扩展JFrame然后在构造函数中创建一个新的JFrame?

你要么:

  1. 扩展JFrame(这不是一个好主意)或
  2. 创建一个新的JFrame(...)
  3. 但你不同时做这两件事。

    //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调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。