当前位置: 首页 > 知识库问答 >
问题:

“extends jframe”和jpanel?

曹原
2023-03-14

下面的代码,如下所示:

public class app extends javax.swing.JFrame implements Runnable {

扩展JFrame。但是我也需要它来扩展JPanel,以便制作一个透明的JPanel。问题是我不能同时扩展这两个,java会犯一个错误:

如果我扩展了JPanel,我就可以生成一个透明的JPanel,但是程序不能运行,因为在几行代码中有一个错误(如果我扩展了JFrame,这个错误就会消失)。

然而,如果我扩展JFrame,程序将运行得很好,但它使我无法执行透明的JPanel。我该怎么解决这个?

共有1个答案

屠华辉
2023-03-14

基本上,创建从JPanel扩展的自定义类,使用setopaque为false使其透明。

创建jframe的实例,将其设置为undaried并单独调整其不透明度。

将自定义面板添加到框架...

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TransparentPanel {

    public static void main(String[] args) {
        new TransparentPanel();
    }

    public TransparentPanel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            try {
                BufferedImage img = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/issue459.jpg"));
                final JLabel label = new JLabel(new ImageIcon(img.getScaledInstance(-1, 200, Image.SCALE_SMOOTH)));
                label.setLayout(new CardLayout());

                JPanel menu = new JPanel(new GridBagLayout());
                JButton button = new JButton("Show");
                menu.add(button);

                JPanel transparent = new JPanel(new GridBagLayout());
                transparent.setOpaque(false);
                transparent.add(new JLabel("Look, I'm see through"));

                label.add(menu, "menu");
                label.add(transparent, "transparent");
                CardLayout layout = (CardLayout) label.getLayout();
                layout.show(label, "menu");

                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        CardLayout layout = (CardLayout) label.getLayout();
                        layout.show(label, "transparent");
                    }
                });

                add(label);
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }
    }    
}
 类似资料:
  • 所以,我正在制作一种文本编辑器,我需要一个用于垂直导航的JScrollPane。但我不能让它工作。 我已经阅读了谷歌搜索结果前十页上的每一篇奇怪的教程,但我无法让它发挥作用。 假设我有JFrame(尺寸1000x800)。我想在其中放置一个JPanel(1000x2000),以便它与JFrame水平对齐。我想在JPanel的右侧粘贴一个简单的滚动条,这样就可以访问它的其余部分。 我减少了大小,我将

  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果

  • 问题内容: 我才刚刚开始研究SQL。 我有一个SQL Server 2008r2数据库,它将返回两个字段DocDate和InvValue。我需要将InvValues汇总为今天的MTD和YTD,所以看起来像 我已经做了大量的Google搜寻,并且可以使用SUM&DATEPART进行一项或多项,但是我坚持尝试两者兼而有之。 有人可以给我一些伪代码,以帮助我进一步谷歌。 谢谢@戈登·利诺夫(Gordon

  • 这个示例代码来自一本Java书籍,从墙上的99瓶啤酒到没有啤酒打印出这首歌。问题是,当墙上是1瓶啤酒时,它仍然写着瓶子。我试图通过在末尾添加部分来解决这个问题。但是,它仍然显示1瓶啤酒在墙上,我瓶啤酒在墙上。 我不知道该改变什么来解决这个问题。是否创建另一个while部分? 如果你能给他们一个提示,这样我就可以自己解决它,那也很酷!因为我知道我的实际歌曲输出是在第一个if部分,但我不知道我应该在哪