在鼠标hover之前,JButton不可见

我正在为我的项目创建一个gui。 首次加载gui时,只能看到背景,因此按钮不可见,但当鼠标hover在它们上面时,它们是可见的。 解决这个问题是什么?

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

}

  1. 不要在像JFrame这样的顶级容器上绘画,因为它们已经承担了绘制所有组件的负担。

  2. 而是在JPanelJComponentJComponentOverride它的paintComponent方法。

  3. 除了重写paintComponent (或者在你的情况下是paint )之外,你还需要在方法内调用super.paintComponent (在你的情况下是super.paint )(方法签名下的第一次调用),以便不破坏绘制链。 如果不这样做可能并且可能会给你留下不希望的油漆文物。

  4. 出于多种原因避免使用空布局。 不同的平台将以不同方式对待它 由于许多其他原因,它们难以维护。 而是使用布局管理器,让他们进行组件的布局和大小调整,因为它们是为Swing应用程序设计的。 了解有关在Container中布置组件的更多信息

  5. Home pancere设置为Home pancerestatic类成员是完全没有意义的。 只需在main方法中声明并实例化两者。

  6. Swing应用程序应该在Event Dispatch Thread(EDT)上运行。 您可以通过使用SwingUtilities.invokeLater...将代码包装在main方法中来实现。 在初始线程中查看更多信息

  7. 不要试图使面板可见且不可见或添加移除面板,而是考虑使用将“分层”面板的CardLayout ,并且可以使用CardLayout的方法(如show()next()previous() 。 有关如何使用CardLayout的更多信息,请参阅

  8. 在部署时,您使用的图像将需要成为嵌入式资源,并且应该从类路径加载,而不是从文件系统加载。 当您将String传递给ImageIcon ,您告诉程序查看文件系统,这可能在您的开发环境中有效,但就是这样。 请参阅嵌入式资源上的wiki标记,密切关注最后一个链接,如果信息未提供足够的详细信息,将为您提供有关如何使用和加载嵌入资源的一些资源。

问题在于

  getContentPane().setLayout(null); 

删除它,因为您已经将布局设置为边框布局,您将看到所有这些按钮。

只要确保除了你想要显示的面板之外的所有其他面板的可设置性设置为false。我也有类似的问题,但我忘了将10个面板中的一个面板的可见性设置为false。问题解决了一旦我设置它是假的。

尝试使用validate(); 主框架上的方法。 我认为这会对你有所帮助。