Java 看不见的GUI?(爪哇)(摇摆)
我正在使用swing编写这个程序。每次我导出程序并运行它时,我尝试设置的GUI都不会出现。JFrame有,但内部组件没有。提前谢谢~Airis 代码:Java 看不见的GUI?(爪哇)(摇摆),java,swing,user-interface,Java,Swing,User Interface,我正在使用swing编写这个程序。每次我导出程序并运行它时,我尝试设置的GUI都不会出现。JFrame有,但内部组件没有。提前谢谢~Airis 代码: 错误:无首先… panel\u Title.油漆(logo\u out)这不是Swing中图形的工作方式…也不是Swing中图像的绘制方式 其次… 您应该使用布局管理器,它们将大大减少潜在的问题,并降低代码的复杂性 第三 应用程序应该在事件调度线程的上下文中启动 public static void main(String args[]) {
错误:无首先…
panel\u Title.油漆(logo\u out)代码>这不是Swing中图形的工作方式…也不是Swing中图像的绘制方式
其次…
您应该使用布局管理器,它们将大大减少潜在的问题,并降低代码的复杂性
第三
应用程序应该在事件调度线程的上下文中启动
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
// Construct your UI here...
}
});
}
第四
正如Andrew也指出的(+1)…您的图像“似乎”是内部资源,无法通过文件
引用访问。您需要以不同的方式加载此类(嵌入式)资源
logo = ImageIO.read(Login.class.getResource("/Data/images/logo_letsmeet.png"));
您还忽略了这些资源null
的可能性,这是一种非常危险的做法
我建议你通读一遍
除了@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的建议。您可以在将来使用此边界技巧来调试布局
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);
}
}
您不在此程序中设置任何布局管理器。这就是为什么你不能显示任何东西的原因。为了更快地获得更好的帮助,请发布一个。2) 不要setLayout(null)
。3) 请参见4)logo_letsmeet.png
看起来像是一个应用程序资源,因此可以通过URL从类路径访问它。5) 在EDT.Amen上启动GUI。你不能猜测这些东西,并期待它神奇地工作。1+。JFrame#add
自动遵从getContentPane()
(从Java 6开始)。到目前为止,我唯一遇到问题的方法是JFrame#removeAll
,它在Java 7下似乎删除了根窗格…拼写为getContentPane()
@MadProgrammer:我不得不帮助一个使用BoxLayout但有问题的人,因为他将其传递到JFrame的setLayout(…)
(没问题),但随后将JFrame传递到BoxLayout的构造函数(大问题!)@HovercraftFullOfEels哦,这是一个需要记住的绝妙技巧!谢谢你的帖子,我会试试这个,谢谢你@MadProgrammer,我会开始实施你的一些技巧。
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);
}