我正在为我的项目创建一个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条答案
按热度按时间wooyq4lh1#
不要在像这样的顶级容器上作画
JFrame
因为他们已经承担了粉刷所有部件的重任。而是在上面画画
JPanel
或者JComponent
以及Override
是的paintComponent
方法。在覆盖之上
paintComponent
(或者在你的情况下)paint
),你也需要打电话super.paintComponent
(就你而言super.paint
)在方法内部(方法签名下的第一个调用),以防中断绘制链。如果不这样做,可能会给你留下不想要的油漆文物。避免使用空布局有很多原因。不同的平台会对他们区别对待。除其他许多原因外,它们很难维护。相反,使用布局管理器,让它们来布局和调整组件的大小,就像设计swing应用程序时那样。了解有关在容器中布局组件的详细信息
设置
Home pancere
作为一个static
班级成员MainClass
完全没有意义。只需在main
方法。swing应用程序应该在事件调度线程(edt)上运行。可以通过将代码 Package 到
main
方法与SwingUtilities.invokeLater...
. 在初始线程中查看更多与其尝试使面板可见或不可见,或者添加删除面板,不如考虑使用
CardLayout
它将“分层”面板,您可以使用CardLayout
的方法,如show()
,next()
,previous()
. 有关如何使用cardlayout的更多信息部署时,您使用的映像需要成为嵌入式资源,并且应该从类路径而不是从文件系统加载。当你把一根线传给
ImageIcon
,您告诉程序查看文件系统,它可能在您的开发环境中工作,但仅此而已。查看嵌入资源上的wiki标签密切关注最后一个链接,如果信息没有提供足够的详细信息,该链接将为您提供有关如何使用和加载嵌入资源的一些资源。30byixjq2#
尝试放入validate();方法。我想这对你有帮助。
yhxst69z3#
只需确保所有其他面板的setvisibility设置为false,除了您希望显示的面板。我也有类似的问题,但我忘记了将10个面板之一的visibility设置为false。一旦设置为false,问题就解决了。
q3qa4bjr4#
问题在于
删除它,因为您已经将布局设置为边框布局,您将看到所有这些按钮。