有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在半透明的JFrame上删除JTextPane的白色背景,而不使用set不透明()

我有一个Java代码,其中我实现了一个半透明的JPanel,上面有一个用2D图形绘制的图像。此图像是一个PNG,包括一个白色矩形,80%不透明,覆盖整个JFrame。现在我需要添加一个JTextPane来显示数据(顺便说一句,我将其设置为使用应用程序包中的自定义字体),但我无法使其半透明:它的白色背景是不透明的(即使使用textPane.setOpaque(false);设置),并且使我的JFrame的透明度有点无用。。。威奇不酷

所以我正在寻找一种方法来去除这个让我抓狂的白色背景

我进行了很多谷歌搜索,但我找到的所有东西都是一个布尔值,用于设置JTextPane的不透明度。我还发现,使用Graphics 2D,我可以创建一个自定义JTextPane并覆盖其背景,但它不起作用。。。我已经试过了

public class MyWindow extends JFrame {

    private static class MyTextPane extends JTextPane {
         public MyTextPane() {
            super();

            setText("Hello World");
            setOpaque(false);
            setBackground(new Color(0,0,0,0));
         }

         @Override
         protected void paintComponent(Graphics g) {
            g.setColor(new Color(0, 0, 0, 0));
            g.fillRect(0, 0, getWidth(), getHeight());

            super.paintComponent(g);
         }
    }

    public static void main(String[] args) {

         MyTextPane textPane = new MyTextPane();

         JPanel panel = new JPanel() {

             private static final long serialVersionUID = 1L;

             @Override
                         protected void paintComponent(Graphics g) {
                              try {
                Image img = ImageIO.read(new File("images/bg.png"));
                g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
                              } catch (IOException e) {
                e.printStackTrace();
              }

                              if (g instanceof Graphics2D) {
                                final int R = 240;
                                final int G = 240;
                                final int B = 240;

                Paint p =
                    new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                        0.0f, getHeight(), new Color(R, G, B, 0), true);
                Graphics2D g2d = (Graphics2D)g;
                g2d.setPaint(p);
                g2d.fillRect(0, 0, getWidth(), getHeight());
            }
        }
    };
    panel.add(textPane);
    setContentPane(panel);

    }

(用Oracle的解释使JFrame半透明,就在这里HERE)谢谢


共 (2) 个答案

  1. # 1 楼答案

    与Nimbus L&;F:

    jta.setOpaque(false);
    jta.setBorder(BorderFactory.createEmptyBorder());
    jta.setBackground(new Color(0,0,0,0));
    
  2. # 2 楼答案

    这就是我如何处理这种想法

    enter image description here

    public class OverlayTextArea {
    
        public static void main(String[] args) {
            new OverlayTextArea();
        }
    
        public OverlayTextArea() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setContentPane(new ImagePane());
                    frame.setLayout(new BorderLayout());
                    frame.add(new TransparentTextArea());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TransparentTextArea extends JTextArea {
    
            public TransparentTextArea() {
                setOpaque(false);
                setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, 10), new LineBorder(Color.LIGHT_GRAY)));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                g.setColor(new Color(255, 255, 255, 128));
                Insets insets = getInsets();
                int x = insets.left;
                int y = insets.top;
                int width = getWidth() - (insets.left + insets.right);
                int height = getHeight() - (insets.top + insets.bottom);
                g.fillRect(x, y, width, height);
                super.paintComponent(g);
            }
    
        }
    
        public class ImagePane extends JPanel {
    
            private BufferedImage background;
    
            public ImagePane() {
                try {
                    background = ImageIO.read(new File("/path/to/background.img"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            public Dimension getPreferredSize() {
                return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (background != null) {
                    int x = (getWidth() - background.getWidth()) / 2;
                    int y = (getHeight() - background.getHeight()) / 2;
                    g.drawImage(background, x, y, this);
                }
            }
    
        }
    
    }
    

    反馈

    • 你真的应该调用super.paintComponent,否则会给它带来严重的麻烦,尤其是在处理透明组件时
    • 不要在paintXxx方法中执行任何长时间运行的任务,比如加载图像。这些方法旨在快速返回,并可在连续时间内多次调用