Java 为什么我能';是否不显示来自主类的此自定义JFrame?

Java 为什么我能';是否不显示来自主类的此自定义JFrame?,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我对JavaSwing开发相当陌生,我有以下问题 我有以下三门课: 1) 仅显示LoginFrame类的Main类: package com.test.login4; import javax.swing.JFrame; public class Main { private static final LoginFrame loginFrame = new LoginFrame(); //private static final GUI gui = new GUI();

我对JavaSwing开发相当陌生,我有以下问题

我有以下三门课:

1) 仅显示LoginFrame类的Main类:

package com.test.login4;

import javax.swing.JFrame;


public class Main {

    private static final LoginFrame loginFrame = new LoginFrame();

    //private static final GUI gui = new GUI();

    public static void main(String[] args) {
          System.out.println("Main ---> main()");   

          loginFrame.setVisible(true);


    }

}
2) 然后我有一个LoginFrame类,它简单地扩展了一个经典的SwingJFrame,它显示了一个登录表单,用户可以在其中插入用户名和密码:

package com.test.login4;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;



public class LoginFrame extends JFrame implements ActionListener {

    private static final int FIXED_WIDTH = 550;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 230);

    private boolean loginResult = true;

    public LoginFrame() {

        System.out.println("Inside LoginFrame ---> LoginFrame()");

        this.setTitle("XCloud Login");

        this.setPreferredSize(INITAL_SIZE);
        this.setResizable(false);

        Container mainContainer = this.getContentPane(); // main Container into
                                                            // the main JFrame

        // JPanel creation and settings of the MigLayout on it:
        // JPanel externalPanel = new JPanel();
        JPanelWithBackground externalPanel = null;

        try {
            // externalPanel = new JPanelWithBackground("resources/logo.png");
            externalPanel = new JPanelWithBackground("src/com/test/resources/logo.png");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill"));

        externalPanel.add(new JLabel("Username"), "w 50%, wrap");
        JTextField userNameTextField = new JTextField(20);

        externalPanel.add(userNameTextField, "w 90%, wrap");

        externalPanel.add(new JLabel("Password"), "w 50%, wrap");
        JTextField pswdTextField = new JTextField(20);
        externalPanel.add(pswdTextField, "w 90%, wrap");

        JButton loginButton = new JButton("Login");
        loginButton.setActionCommand("loginAction");
        loginButton.addActionListener(this);

        externalPanel.add(loginButton, "w 25%, wrap");

        mainContainer.add(externalPanel);
        // mainFrame.add(mainContainer);
        // loginFrame.setVisible(true);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }

}
3) 此类使用JPanelWithBackground对象来创建背景图像

package com.test.login4;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class JPanelWithBackground extends JPanel {

      private Image backgroundImage;

      // Some code to initialize the background image.
      // Here, we use the constructor to load the image. This
      // can vary depending on the use case of the panel.
      public JPanelWithBackground(String fileName) throws IOException {
        backgroundImage = ImageIO.read(new File(fileName));
      }

      public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw the background image.
        //g.drawImage(backgroundImage, 0, 0, this);
        g.drawImage(backgroundImage, 0, 0, 550, 230, this);
      }
    }
我的问题是,当我执行时,Main类在我看来是Java应用程序的图标(在Ubuntu栏上),但我无法显示LoginFrame窗口

为什么??我错过了什么


我尝试创建并显示一个经典的JFrame,而不是我的LoginFrame(在主类中),我没有问题。

方法
this.setPreferredSize(初始大小)不符合您的期望。在
LoginFrame
构造函数上调用
setSize
方法

  setSize(INITAL_SIZE);

方法
this.setPreferredSize(初始大小)不符合您的期望。在
LoginFrame
构造函数上调用
setSize
方法

  setSize(INITAL_SIZE);

方法
this.setPreferredSize(初始大小)不符合您的期望。在
LoginFrame
构造函数上调用
setSize
方法

  setSize(INITAL_SIZE);

方法
this.setPreferredSize(初始大小)不符合您的期望。在
LoginFrame
构造函数上调用
setSize
方法

  setSize(INITAL_SIZE);

有许多事情你应该改变

在调用loginFrame.setVisible()之前调用loginFrame.pack()应该允许它正确调整自身大小并显示

不需要将loginFrame设置为静态。让它成为主方法中的一个变量——尽管它确实应该从使用登录框架的程序代码中调用


LoginFrame应该扩展JDialog而不是JFrame。除非您使用多个不同大小的监视器,否则您的程序中应该只有JFrame上的监视器。任何应该位于主程序顶部的内容都可以成为JDialog。

有许多内容需要更改

在调用loginFrame.setVisible()之前调用loginFrame.pack()应该允许它正确调整自身大小并显示

不需要将loginFrame设置为静态。让它成为主方法中的一个变量——尽管它确实应该从使用登录框架的程序代码中调用


LoginFrame应该扩展JDialog而不是JFrame。除非您使用多个不同大小的监视器,否则您的程序中应该只有JFrame上的监视器。任何应该位于主程序顶部的内容都可以成为JDialog。

有许多内容需要更改

在调用loginFrame.setVisible()之前调用loginFrame.pack()应该允许它正确调整自身大小并显示

不需要将loginFrame设置为静态。让它成为主方法中的一个变量——尽管它确实应该从使用登录框架的程序代码中调用


LoginFrame应该扩展JDialog而不是JFrame。除非您使用多个不同大小的监视器,否则您的程序中应该只有JFrame上的监视器。任何应该位于主程序顶部的内容都可以成为JDialog。

有许多内容需要更改

在调用loginFrame.setVisible()之前调用loginFrame.pack()应该允许它正确调整自身大小并显示

不需要将loginFrame设置为静态。让它成为主方法中的一个变量——尽管它确实应该从使用登录框架的程序代码中调用



LoginFrame应该扩展JDialog而不是JFrame。除非您使用多个不同大小的监视器,否则您的程序中应该只有JFrame上的监视器。任何应该放在主程序顶部的东西都可以做成JDialog。

还有setBounds方法让你有setSize,另外还有x,y作为你的框架。

还有setBounds方法让你有setSize,另外还有x,y作为你的框架。

还有setBounds方法让你有setSize,另外还有x,y代表你的框架。

和setBounds方法使你有了setSize,另外还有x,y代表你的框架。

1)为了更快地获得更好的帮助,请发布一个。2) 请参见本例,登录应该是模态的
JDialog
JOptionPane
。您不应该硬编码JPanelWithBackground的大小。使用您在中阅读的图像的大小。1)要更快获得更好的帮助,请发布一个。2) 请参见本例,登录应该是模态的
JDialog
JOptionPane
。您不应该硬编码JPanelWithBackground的大小。使用您在中阅读的图像的大小。1)要更快获得更好的帮助,请发布一个。2) 请参见本例,登录应该是模态的
JDialog
JOptionPane
。您不应该硬编码JPanelWithBackground的大小。使用您在中阅读的图像的大小。1)要更快获得更好的帮助,请发布一个。2) 请参见本例,登录应该是模态的
JDialog
JOptionPane
。您不应该硬编码JPanelWithBackground的大小。使用您读入的图像的大小。设置帧的大小既不是必要的,也不是最佳的。@AndrewThompson,我知道,但是使用
setSize
OP可以查看登录帧。
pack()
是需要的。如果有任何自定义组件未以其他方式建议大小(例如a
BGImagePanel
),则该自定义组件应具有首选大小集(或已覆盖)。如果希望代码在进行更改时继续按预期工作,请不要调用setSize。你以后会遇到问题的。这两种方法都没有必要