在透明的JTextPane中插入

时间:2013-11-26 17:18:59

标签: java swing

我正在编写的程序中有一个透明的,可编辑的JTextPane(允许背景显示),除了文本插入符号外,一切都运行良好。

插入符号本身正常运行,但每次绘制它都会破坏其后面区域的透明度,如图所示:

image

有没有办法让插入符号的背景透明而不重新绘制整个帧? DefaultCaret没有setOpaque()方法,所以我不太清楚如何解决这个问题。

谢谢!

编辑:我还不能回答我自己的问题,但最后我写了一个完美的SSCCE,所以我的程序肯定还有其他问题。为了将来参考,这是我写的(工作)代码:

import java.awt.*;

import javax.swing.*;

class TransparentScrollPane extends JScrollPane {
    public TransparentScrollPane(Component view) {
        super(view);        
        this.setPreferredSize(new Dimension(540,480));
        this.setOpaque(false);
        this.viewport.setOpaque(false);
        this.setBorder(null);
    }
}

public class TextPaneExample extends JTextPane {

    public TextPaneExample()
    {
        super();
        this.setOpaque(false);
    }
    public void paintComponent(Graphics g)
    {
        g.setColor(new Color(255,255,255,128));
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(640, 480);

        JPanel panel = new JPanel();
        panel.setBackground(new Color(255,128,255));

        TextPaneExample textPane = new TextPaneExample();
        TransparentScrollPane scroller = new 
                TransparentScrollPane(textPane);
        textPane.setBackground(new Color(255,255,255,128));

        frame.add(panel);

        panel.add(scroller,BorderLayout.CENTER);

        frame.setVisible(true);

    }

}

1 个答案:

答案 0 :(得分:1)

有关问题和一些解决方案,请参阅Backgrounds With Transparency

基本上你可以使用:

panel.add( new AlphaContainer(componentWithTransparency) );

对于你的第一个问题,你得到一个免费答案:)未来的问题应该包括一个证明问题的正确SSCCE