简体   繁体   English

隐形GUI? (Java)(Swing)

[英]Invisible GUI? (Java) (Swing)

I am working on this program, using swing. 我正在研究这个程序,使用swing。 Every time I export the program, and run it, the GUI I atempt to set up doesn't appear. 每次导出程序并运行它时,我都会尝试设置的GUI。 The JFrame does, but not the inner components. JFrame可以,但不是内部组件。 Thanks in advance ~Airis 提前谢谢〜艾利斯

Code: 码:

import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Login {
    public static void login_Interface(){

        //Start GUI style//
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        //      End     //

        JFrame login_Frame = new JFrame("Login - LetsMeet");
        login_Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        login_Frame.setSize(750, 650);
        login_Frame.setResizable(true);

        JPanel panel_Title = new JPanel();                            //PANEL Title
        panel_Title.setBounds(0, 0, 750, 150);
        panel_Title.setLayout(null);
        Image logo = null;
        try {
            logo = ImageIO.read(new File("Data/images/logo_letsmeet.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D logo_out = ((BufferedImage) logo).createGraphics();
        panel_Title.paint(logo_out);

        JPanel login_Panel = new JPanel();                            //LOGIN Panel
        login_Panel.setBounds(0, 150, 350, 150);
        login_Panel.setLayout(null);
        JTextField username_login = new JTextField("Username");
        username_login.setBounds(100, 50, 100, 25);
        JPasswordField password_login = new JPasswordField();
        password_login.setBounds(200, 50, 100, 25);
        JButton login_go = new JButton("Login");
        login_go.setBounds(200, 50, 100, 25);
        login_Panel.add(password_login);
        login_Panel.add(username_login);


        JPanel panel_Divider = new JPanel();                          //PANEL Divider
        login_Panel.setBounds(350, 150, 50, 150);
        panel_Divider.setSize(50, 100);
        panel_Divider.setLayout(null);
        Image sep = null;
        try {
            sep = ImageIO.read(new File("Data/images/sep.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D div = ((BufferedImage) sep).createGraphics();
        panel_Title.paint(div);

        JPanel register_Panel = new JPanel();                         //REGISTER Panel
        register_Panel.setBounds(400, 150, 350, 150);
        register_Panel.setLayout(null);

        login_Frame.add(panel_Title);
        login_Frame.add(login_Panel);
        login_Frame.add(panel_Divider);
        login_Frame.add(register_Panel);
        login_Frame.setVisible(true);
    }
}

Errors: None 错误:无

Firstly... 首先...

panel_Title.paint(logo_out); this is not how graphics work in Swing...nor is it how images are painted in Swing 这不是Swing中图形的工作方式......也不是Swing中图像的绘制方式

Secondly... 其次...

You should be making use of layout managers, they will greatly reduce potential issues as well as reduce the complexity of your code. 您应该使用布局管理器,它们将大大减少潜在问题并降低代码的复杂性。

Thirdly 第三

You application should be started within the context of the Event Dispatching Thread... 您的应用程序应该在Event Dispatching Thread的上下文中启动...

public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            // Construct your UI here...
        }
    });
}

Fourthly 第四

As Andrew has also pointed out (+1)...your images "appear" to be internal resources, which will not be accessible via a File reference. 正如安德鲁也指出(+1)......你的图像“看起来”是内部资源,无法通过File参考访问。 You need to load these kind of (embedded) resources differently... 您需要以不同方式加载这些(嵌入式)资源...

logo = ImageIO.read(Login.class.getResource("/Data/images/logo_letsmeet.png"));

You also ignore the potential for these resources to be null which is a very dangerous practice. 您也忽略了这些资源为null的可能性,这是一种非常危险的做法。

I would suggest you have a read through 我建议你仔细阅读

Besides all the suggestion made by @MadProgammer, you need to add your controls to the JFrame content pane, like this: 除了@MadProgammer提出的所有建议外,您还需要将控件添加到JFrame内容窗格,如下所示:

login_Frame.getContentPane().add(panel_Title);
login_Frame.getContentPane().add(login_Panel);
...

Then your controls should appear 然后你的控件应该出现

Update: 更新:

Running your actual code, and adding a colored border to the containers ( JPanels ), I got the following: 运行您的实际代码,并为容器( JPanels )添加彩色边框,我得到以下内容:

panel_Title.setBorder(BorderFactory.createLineBorder(Color.BLUE));
login_Panel.setBorder(BorderFactory.createLineBorder(Color.RED));
panel_Divider.setBorder(BorderFactory.createLineBorder(Color.GREEN));
register_Panel.setBorder(BorderFactory.createLineBorder(Color.YELLOW));

在此输入图像描述

Basically your code has layout configuration problems. 基本上你的代码有布局配置问题。 Again, follow the suggestion of @MadProgammer. 再次,按照@MadProgammer的建议。 You could use this border trick in future to debug your layouts 您可以在将来使用此边框技巧来调试布局

import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Login {
    public static void login_Interface(){

        //Start GUI style//
        try {
                 UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e1) {
             e1.printStackTrace();
        } catch (InstantiationException e1) {
             e1.printStackTrace();
        } catch (IllegalAccessException e1) {
             e1.printStackTrace();
         } catch (UnsupportedLookAndFeelException e1) {
              e1.printStackTrace();
         }
          //      End     //

          JFrame login_Frame = new JFrame("Login - LetsMeet");
          login_Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         login_Frame.setSize(750, 650);
          login_Frame.setResizable(true);

         JPanel panel_Title = new JPanel();                            //PANEL Title
         panel_Title.setBounds(0, 0, 750, 150);
         panel_Title.setLayout(null);
         Image logo = null;
         try {
              logo = ImageIO.read(new File("Data/images/logo_letsmeet.png"));
          } catch (IOException e) {
              e.printStackTrace();
         }
         Graphics2D logo_out = ((BufferedImage) logo).createGraphics();
         panel_Title.paint(logo_out);

           JPanel login_Panel = new JPanel();                            //LOGIN Panel
          login_Panel.setBounds(0, 150, 350, 150);
          login_Panel.setLayout(null);
          JTextField username_login = new JTextField("Username");
    username_login.setBounds(100, 50, 100, 25);
    JPasswordField password_login = new JPasswordField();
    password_login.setBounds(200, 50, 100, 25);
    JButton login_go = new JButton("Login");
    login_go.setBounds(200, 50, 100, 25);
    login_Panel.add(password_login);
    login_Panel.add(username_login);


    JPanel panel_Divider = new JPanel();                          //PANEL Divider
    login_Panel.setBounds(350, 150, 50, 150);
    panel_Divider.setSize(50, 100);
    panel_Divider.setLayout(null);
    Image sep = null;
    try {
        sep = ImageIO.read(new File("Data/images/sep.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    Graphics2D div = ((BufferedImage) sep).createGraphics();
    panel_Title.paint(div);

    JPanel register_Panel = new JPanel();                         //REGISTER Panel
    register_Panel.setBounds(400, 150, 350, 150);
    register_Panel.setLayout(null);

    login_Frame.add(panel_Title);
    login_Frame.add(login_Panel);
    login_Frame.add(panel_Divider);
    login_Frame.add(register_Panel);
    login_Frame.setVisible(true);
}

} }

You do not set any layout manager in this program . 您没有在此程序中设置任何布局管理器。 That's why u can't display any thing 这就是为什么你不能展示任何东西

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM