【问题标题】:Invisible GUI? (Java) (Swing)隐形图形用户界面? (Java) (摇摆)
【发布时间】:2012-12-11 20:35:40
【问题描述】:

我正在使用 swing 开发这个程序。每次我导出程序并运行它时,我尝试设置的 GUI 都不会出现。 JFrame 有,但内部组件没有。在此先感谢~Airis

代码:

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);
    }
}

错误:无

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)不要setLayout(null)。 3) 请参阅The Use of Multiple JFrames, Good/Bad Practice? 4) logo_letsmeet.png 似乎是一个应用程序资源,因此请通过 URL 从类路径访问它。 5) 在 EDT 上启动 GUI。

标签: java swing user-interface


【解决方案1】:

首先...

panel_Title.paint(logo_out);这不是图形在 Swing 中的工作方式...也不是图像在 Swing 中的绘制方式

其次...

您应该使用布局管理器,它们将大大减少潜在问题并降低代码的复杂性。

第三

您的应用程序应该在事件调度线程的上下文中启动...

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

第四

正如 Andrew 还指出的 (+1)...您的图像“似乎”是内部资源,无法通过 File 引用访问。您需要以不同的方式加载这些(嵌入式)资源...

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

您还忽略了这些资源可能是null,这是一种非常危险的做法。

我建议你通读一遍

【讨论】:

  • 阿门。您无法猜测这些东西并期望它会神奇地起作用。 1+。
【解决方案2】:

除了@MadProgammer 提出的所有建议之外,您还需要将控件添加到JFrame 内容窗格,如下所示:

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

然后你的控件应该会出现

更新:

运行您的实际代码,并为容器添加彩色边框 (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));

基本上您的代码存在布局配置问题。再次,遵循@MadProgammer 的建议。你以后可以使用这个边框技巧来调试你的布局

【讨论】:

  • JFrame#add 自动推迟到 getContentPane()(从 Java 6 开始)。到目前为止,我遇到的唯一方法是JFrame#removeAll,它在 Java 7 下似乎删除了根窗格...
  • 拼写为getContentPane()。 @MadProgrammer:我不得不帮助这里使用 BoxLayout 并遇到问题的人,因为他将其传递给 JFrame 的setLayout(...)(没问题),但随后将 JFrame 传递给 BoxLayout 的构造函数(大问题!)。跨度>
  • @HovercraftFullOfEels 哦,这是一个非常棒的提示!
  • 谢谢你的帖子,我会试试这个,谢谢@MadProgrammer 我会开始实施你的一些技巧。
【解决方案3】:
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);
}

}

您没有在此程序中设置任何布局管理器。这就是为什么你不能显示任何东西

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2012-01-31
    • 2016-01-30
    • 2016-08-09
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多