【问题标题】:JPanel transparent background and display elements [duplicate]JPanel透明背景和显示元素[重复]
【发布时间】:2020-05-19 05:51:12
【问题描述】:

我在JPanel 中插入了一个背景图片e,但一些界面元素消失了。不会出现以下 Java Swing 元素:

  • label_titulo
  • label_usuario
  • 标签密码
  • button_acceder

**你能不能让图像透明或者元素不透明(setOpaque (false)),即使把它放在那些元素上也不适合我。

为什么有些元素有矩形将它们封装成灰色?**

代码:

public class InicioSesion extends javax.swing.JFrame{
    private Image imagenFondo;
    private URL fondo;

    public InicioSesion(){
        initComponents();

        try{
            fondo = this.getClass().getResource("fondo.jpg");
            imagenFondo = ImageIO.read(fondo);
        }catch(IOException ex){
            ex.printStackTrace();
            System.out.print("Imagen no cargada.");
        }
    }


    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.drawImage(imagenFondo, 0, 0, getWidth(), getHeight(), this);
    }
}

加载“RUN”时,.java 文件在我看来如下:

原来的设计如下:

【问题讨论】:

  • 使用 JDialog 比 JFrame 更好地实现登录屏幕。
  • @GilbertLeBlanc 对,我刚刚改了。
  • 你为什么要问这个问题?您已经得到了上一个问题的答案:stackoverflow.com/questions/61851372/…。您为什么要更改代码以在框架上而不是在 JPanel 上进行绘制来浪费我们的时间?

标签: java swing jpanel


【解决方案1】:
public void paint(Graphics g){
    super.paint(g);
    g.drawImage(imagenFondo, 0, 0, getWidth(), getHeight(), this);
}

不要覆盖paint()。 paint 方法负责绘制子组件。因此,您的代码会绘制子组件,然后将图像绘制在组件之上。

相反,对于组件的自定义绘制,您需要覆盖 JPanelpaintComponent() 方法:

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(imagenFondo, 0, 0, getWidth(), getHeight(), this);
}

阅读 A Closer Look at the Paint Mechanism 上的 Swing 教程部分了解更多信息。

编辑:

阅读 Custom Painting 上的 Swing 教程的整个部分。解决方案是在 JPanel 上进行自定义绘画,然后将面板添加到框架中。

框架的内容窗格是 JPanel。因此,您实际上将用绘制背景图像的自定义 JPanel 替换默认内容窗格。将自定义面板的布局设置为 BorderLayout,它将像默认内容面板一样工作。

【讨论】:

  • @camickr 错误:super.paintComponent(g);找不到符号
  • @camick So.. 我必须使用什么方法? paint(Graphics g) 或 paintComponent(Graphics g)
  • @omaza1990,我没有注意到您正在扩展 JFrame,您的问题只涉及 JPanel。对于自定义绘画,您不应该扩展 JFrame。自定义绘画是在 Swing 组件上完成的,在您的情况下是 JPanel。见编辑。
  • 1) 问题已得到解答。 2)您在上一个问题中已经得到了相同的答案。因此,当您已经有答案时,无需继续发布相同的问题。
  • 有什么好讨论的?您的主题标题是关于 JPanel。因此,我为您提供了有关如何在 JPanel 上正确绘制的答案。然后我意识到您的代码实际上是使用 JFrame,而不是面板,因此我澄清了答案并为您提供了指向包含完整示例的 Swing 教程的链接。后来我意识到你已经从前一天的问题中获得了一个工作示例。您已经获得了大量有关如何在面板上绘制背景图像并将组件添加到同一面板的信息。
猜你喜欢
  • 2011-12-15
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多