Java - 透明的JScrollPane

7

我有一个JTextArea,它在JScrollPane上面。无论如何,我知道我可以使用getViewPort()方法来设置视口的opaque属性,但是我似乎找不到任何关于如何做到这一点的线索。

以下是我目前所拥有的:

if (e.getKeyCode() == KeyEvent.VK_F)
{
    if (sp.isVisible())
    {
        sp.setVisible(false);
    }
    else
    {
        sp.setVisible(true);
    }
}

你是想设置滚动面板的不透明度(即使其更加透明/不透明),还是只是想让它可见/不可见?如果是后者,那么我认为你不需要使用视口来实现。 - Nate W.
没有 SCCEE 是因为我不知道该怎么做。 - test
2
你曾评论“文本区域透明”,但人们并未理解,所以你有一些代码可以尝试,如果大家能看到你所说的内容,或许我们可以提供另一种解决方案。但如果你不愿意花点功夫发布SSCCE,那我肯定不会浪费时间去猜你在说什么。我走了! - camickr
2
@Dan:@camickr 的这个简短示例可能是一个有用的起点:http://stackoverflow.com/questions/2846497 - trashgod
2
你有一些代码,它的运行结果与你预期的不同。这就是一个 SSCCE 的定义。向我们展示你的问题,因为你无法描述问题。你是否会花时间阅读给你提供的建议?你是否阅读了链接以了解 SSCCE 是什么? - camickr
显示剩余3条评论
3个回答

31

您需要使用setOpaque(false)使其透明。在JScrollPane和它的ViewPort上都要调用。

sp.setOpaque(false);
sp.getViewport().setOpaque(false);

如果您还希望JTextArea透明,请同样调用setOpaque(false)


我能不能只是...那个词...将透明度设置为某个数字? - test
出现错误了...这是我的代码:sp.setOpaque(false); sp.getViewPort().setOpaque(false); c.setOpaque(false);这是我的错误信息: C:\wamp\www\mystikrpg\tileGen.java:572: 找不到符号 符号:方法 getViewPort() 位置:类javax.swing.JScrollPane sp.getViewPort().setOpaque(false); ^ 1个错误工具以退出码1完成。 - test
哦,你想设置不透明度。我认为在JScrollPanes中这是不可能的。据我所知,你要么完全透明,要么完全不透明。 - Serplat
好的,当我这样做时...我的JExtarea的背景变成了,尽管我仍然看到文本...我猜它有效了?但它不是透明的。 - test
我认为那不会起作用。我不知道如何实现你所请求的内容。 - Serplat
显示剩余6条评论

9
你与@Serplat的对话表明你可能混淆了不透明度透明度

不透明度是Swing组件的布尔属性,用于优化绘图:

  • true:该组件同意绘制其矩形边界内包含的所有位。
  • false:该组件不保证绘制其矩形边界内的所有位。

透明度是合成数字图像的一种方法,如此示例所示。

考虑到这种区别可能有助于澄清您的问题或聚焦您寻找更多信息的方向。

补充说明:基于@camickr的示例,下面的示例显示一个蓝色正方形“粘”在视口上,而灰色棋盘可以滚动在其上。

ScrollPanePaint

import java.awt.*;
import javax.swing.*;

/** @see https://stackoverflow.com/questions/2846497 */
public class ScrollPanePaint extends JFrame {

    private static final int TILE = 64;

    public ScrollPanePaint() {
        JViewport viewport = new MyViewport();
        viewport.setView(new MyPanel());
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewport(viewport);
        this.add(scrollPane);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    private static class MyViewport extends JViewport {

        public MyViewport() {
            this.setOpaque(false);
            this.setPreferredSize(new Dimension(6 * TILE, 6 * TILE));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.blue);
            g.fillRect(TILE, TILE, 3 * TILE, 3 * TILE);
        }
    }

    private static class MyPanel extends JPanel {

        public MyPanel() {
            this.setOpaque(false);
            this.setPreferredSize(new Dimension(9 * TILE, 9 * TILE));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.lightGray);
            int w = this.getWidth() / TILE + 1;
            int h = this.getHeight() / TILE + 1;
            for (int row = 0; row < h; row++) {
                for (int col = 0; col < w; col++) {
                    if ((row + col) % 2 == 0) {
                        g.fillRect(col * TILE, row * TILE, TILE, TILE);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ScrollPanePaint();
            }
        });
    }
}

实际上,我希望我可以将图像用作JScrollPane的背景...因为我无法真正设置不透明度...但还是谢谢。 - test
1
@Dan:确实,opacity 要么是开启的,要么是关闭的。我在上面添加了一个示例,可能会提供一种前进的方式。 - trashgod

3

JScrollPane透明背景的代码。

  JScrollPane scrollPane = new JScrollPane();

   JViewport viewport = new JViewport();


 //Component that need to be added in Scroll pane//

   viewport.setView(new JPanel());

   viewport.setOpaque(false);

   scrollPane.setViewport(viewport);

   scrollPane.getViewport().setOpaque(false);

   scrollPane.setOpaque(false);

 // Add Scrollpane to Jframe or JPanel//

   add( scrollPane,BorderLayout.CENTER); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接