【问题标题】:Java - Transparent JScrollPaneJava - 透明的 JScrollPane
【发布时间】:2011-03-31 20:53:10
【问题描述】:

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

这是我目前所拥有的:

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

【问题讨论】:

  • 您是在尝试设置滚动窗格的不透明度(即使其更加透明/不透明),还是仅仅让它可见/不可见?如果是后者,那么我认为您不需要使用视口来执行此操作。
  • 您的 SSCCE (sscce.org) 在哪里,它显示了您目前的情况并显示了您遇到的问题?您过去曾被要求获得 SSCCE。由于您无法很好地解释您的要求,人们正在浪费太多时间试图理解您的问题。
  • 您发表了关于人们不理解的“文本区域被透视”的评论,因此您有一些可以正常工作的代码,如果人们可以看到您在说什么,那么也许我们可以提供另一种解决方案。但是,如果您不愿意努力发布 SSCCE,那么我肯定不会浪费时间猜测您在说什么。我走了!
  • @Dan:@camickr 的这个简短示例可能是一个有用的起点:stackoverflow.com/questions/2846497
  • 您的某些代码无法按照您期望的方式运行。根据定义,这是一个 SSCCE。向我们展示您的问题,因为您无法描述问题。你甚至会费心阅读给你的建议。您是否阅读了链接以了解 SSCCE 是关于什么的?

标签: java swing jscrollpane


【解决方案1】:

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

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

如果您也想要透明,您还必须在 JTextArea 上调用 setOpaque(false)。

【讨论】:

  • 我可以不只是......这个词是什么......将透明度设置为某个数字?
  • 出现错误...这是我所拥有的: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 奇怪
  • 哦,你要设置不透明度。我认为 JScrollPanes 不可能。据我所知,您要么必须完全透明,要么完全不透明。
  • 第 572 行:sp.getViewPort().setOpaque(false);
  • 抱歉,打错了。它应该是 getViewport() 而不是 getViewPort()
【解决方案2】:

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

Opacity 是用于优化绘图的 Swing 组件的布尔属性:

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

Transparency 是一种合成数字图像的方法,如 example 所示。

考虑到区别可能有助于澄清您的问题或集中搜索更多信息。

附录:基于@camickr 的example,下面的示例显示了一个“粘”在视口上的蓝色方块,而灰色的棋盘可以在上面滚动。

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 的背景上使用图像...因为我无法真正设置不透明度...但是谢谢
  • @Dan:确实,opacity 要么打开要么关闭。我在上面添加了一个示例,它可能会暗示前进的方向。
【解决方案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); 

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 2013-03-03
    • 2011-09-16
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2020-07-07
    相关资源
    最近更新 更多