我正在为我的项目创建一个gui。首次加载gui时,只能看到背景,因此按钮不可见,但当鼠标悬停在它们上面时,它们是可见的。什么解决了这个问题?
public class Home extends JFrame{
//New JPanel
private JPanel home;
//Creating image url. You must be change url
ImageIcon icon = new ImageIcon("img//home1.jpeg");
//Home Class
public Home(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 960, 640);
setTitle("LoneyTunes Crush");
home = new JPanel();
home.setBorder(new EmptyBorder(5, 5, 5, 5));
home.setLayout(new BorderLayout(0, 0));
setContentPane(home);
getContentPane().setLayout(null);
JLabel background = new JLabel(new ImageIcon("img//giphy."));
getContentPane().add(background);
background.setLayout(new FlowLayout());
//Creating Buttons
JButton play = new JButton("Play");
play.setBounds(20, 20, 200, 30);
JButton setting = new JButton("Settings");
setting.setBounds(20, 60, 200, 30);
JButton exit = new JButton("Exit");
exit.setBounds(20, 100, 200, 30);
//Adding Buttons
home.add(play);
home.add(setting);
home.add(exit);
//ActionListeners
play.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
home.setVisible(false);
difficulty.setVisible(true);
}
});
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(1);
}
});
validate();
}
//Background paint method
public void paint(Graphics g){
g.drawImage(icon.getImage(), 0, 0, getWidth(), getHeight(), null);
}
}
主类
public class MainClass {
public static Home pencere;
public static void main(String args[]){
pencere=new Home();
pencere.setVisible(true);
}
}
答案 0 :(得分:6)
不要在像JFrame
这样的顶级容器上绘画,因为它们已经承担了绘制所有组件的负担。
而是在JPanel
或JComponent
以及Override
paintComponent
方法上绘画。
除了覆盖paintComponent
(或在您的情况下为paint
)之外,您还需要在内部调用super.paintComponent
(在您的情况下为super.paint
)方法(在方法签名下首次调用),以免破坏绘制链。如果不这样做,可能会给您留下不受欢迎的油漆文物。
出于多种原因,避免使用空布局。不同的平台将以不同方式对待它由于许多其他原因,它们难以维护。而是使用布局管理器,让他们进行组件的布局和大小调整,因为它们是为Swing应用程序设计的。请访问Laying out components Within a Container
将Home pancere
设置为static
的{{1}}类成员完全没有意义。只需在MainClass
方法中声明并实例化。
Swing应用程序应该在Event Dispatch Thread(EDT)上运行。您可以使用main
将代码包含在main
方法中。详情请见Initial Threads
考虑使用“图层”面板的SwingUtilities.invokeLater...
,而不是尝试使面板可见且不可见或添加删除面板,您可以浏览它们使用CardLayout
,CardLayout
,show()
等next()
方法。详情请见How to Use CardLayout
到部署时,您使用的图像需要成为嵌入式资源,并且应该从类路径加载,而不是从文件系统加载。当您将字符串传递给previous()
时,您告诉程序查看文件系统,这可能在您的开发环境中有效,但就是这样。请参阅embedded-resource上的wiki标记,密切关注最后一个链接,如果信息没有提供足够的详细信息,将提供有关如何使用和加载嵌入资源的一些资源。
答案 1 :(得分:0)
问题在于
getContentPane().setLayout(null);
将其删除,因为您已将布局设置为边框布局,您将看到所有这些按钮。
答案 2 :(得分:0)
确保除了您希望显示的面板之外的所有其他面板的可设置性设置为false。我也有类似的问题,但我忘记将10个面板中的一个面板的可见性设置为false。问题已解决一旦我把它设置为假。
答案 3 :(得分:-2)
尝试使用validate();主框架上的方法。我认为这会对你有帮助。