在半透明的JFrame上删除没有setOpaque()的JTextPane的白色背景

时间:2013-01-05 22:58:40

标签: java swing transparency jtextpane

我有一个Java代码,我在其中实现了一个半透明的JPanel,其上使用Graphics 2D绘制了图像。此图像是一个PNG,包含一个白色矩形,80%不透明,遍布JFrame。现在我需要添加一个JTextPane来显示数据(我将它设置为使用应用程序包BTW中的自定义字体),但我无法使其变得半透明:它的白色背景是不透明的(即使使用{{1}设置)并使我的JFrame的透明度有点无用......这并不酷。

所以我正在寻找一种方法来消除这种让我烦恼的白色背景。

我推出了许多Google搜索,但我找到的所有内容都是布尔值来设置JTextPane的不透明度。我还发现使用Graphics 2D我可以创建一个自定义的JTextPane并覆盖它的背景,但它没有用......我已经尝试了所有这些。

textPane.setOpaque(false);

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

2 个答案:

答案 0 :(得分:4)

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

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方法中执行任何长时间运行的任务,例如加载图像。这些方法旨在快速返回,并可在连续中多次调用...

答案 1 :(得分:1)

使其适用于Nimbus L&amp; F:

jta.setOpaque(false);
jta.setBorder(BorderFactory.createEmptyBorder());
jta.setBackground(new Color(0,0,0,0));