在鼠标悬停之前,JButton不可见

时间:2014-03-11 10:52:06

标签: java swing background jbutton paint

我正在为我的项目创建一个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);
}

}

4 个答案:

答案 0 :(得分:6)

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

  2. 而是在JPanelJComponent以及Override paintComponent方法上绘画。

  3. 除了覆盖paintComponent(或在您的情况下为paint)之外,您还需要在内部调用super.paintComponent(在您的情况下为super.paint)方法(在方法签名下首次调用),以免破坏绘制链。如果不这样做,可能会给您留下不受欢迎的油漆文物。

  4. 出于多种原因,避免使用空布局。不同的平台将以不同方式对待它由于许多其他原因,它们难以维护。而是使用布局管理器,让他们进行组件的布局和大小调整,因为它们是为Swing应用程序设计的。请访问Laying out components Within a Container

  5. 了解详情
  6. Home pancere设置为static的{​​{1}}类成员完全没有意义。只需在MainClass方法中声明并实例化。

  7. Swing应用程序应该在Event Dispatch Thread(EDT)上运行。您可以使用main将代码包含在main方法中。详情请见Initial Threads

  8. 考虑使用“图层”面板的SwingUtilities.invokeLater...,而不是尝试使面板可见且不可见或添加删除面板,您可以浏览它们使用CardLayoutCardLayoutshow()next()方法。详情请见How to Use CardLayout

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

答案 1 :(得分:0)

问题在于

 getContentPane().setLayout(null);

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

答案 2 :(得分:0)

确保除了您希望显示的面板之外的所有其他面板的可设置性设置为false。我也有类似的问题,但我忘记将10个面板中的一个面板的可见性设置为false。问题已解决一旦我把它设置为假。

答案 3 :(得分:-2)

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