标签:java background swing paint jbutton
我正在为我的项目创建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);
}
}
解决方法:
>不要在像JFrame这样的顶级容器上绘制,因为它们已经承担了绘制所有组件的负担.
>而是在JPanel或JComponent上绘画,并重写它的paintComponent方法.
>在覆盖paintComponent(或您的情况下的paint)之上,您还需要在方法内部调用super.paintComponent(在您的情况下为super.paint)(在方法签名下首先调用),以免破坏paint链.否则,可能会留下不希望的油漆瑕疵.
>出于多种原因,请避免使用空布局.不同的平台会区别对待它们.除其他原因外,它们很难维护.而是使用布局管理器,让他们像设计用于Swing应用程序那样对组件进行布局和调整大小.在Laying out components Within a Container了解更多
>将Home pancere设置为MainClass的静态类成员是完全没有意义的.只需在main方法中进行声明和实例化即可.
> Swing应用程序应在事件调度线程(EDT)上运行.您可以通过使用SwingUtilities.invokeLater将代码包装在main方法中来实现….更多内容请参见Initial Threads
>与其尝试使面板不可见或不可见或不添加面板,不如考虑使用CardLayout来“分层”面板,您可以使用CardLayout的show(),next(),previous()等方法在面板中进行导航.看到更多在How to Use CardLayout
>在部署时,您正在使用的映像将需要成为嵌入式资源,并且应该从类路径而不是文件系统中加载.当将String传递给ImageIcon时,就是在告诉程序在文件系统中查找,这可能在您的开发环境中起作用,仅此而已.请参阅embedded-resource上的wiki标签,密切关注最后一个链接,该链接将为您提供一些有关如何使用和加载嵌入式资源(如果信息未提供足够详细信息)的资源.
标签:java,background,swing,paint,jbutton 来源: https://codeday.me/bug/20191011/1889001.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。