7

私はJTextAreaを持っていて、それはJScrollPaneの上に乗っています。とにかく、このgetViewPort()メソッドを使用してビューポートの不透明なプロパティを設定できることはわかっていますが、それを行う方法の兆候はどこにも見つからないようです。

これが私がこれまでに持っているものです:

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

3 に答える 3

28

setOpaque(false)透明にするために使用する必要があります。JScrollPane と ViewPort の両方で呼び出します。

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

setOpaque(false)透明にしたい場合は、JTextAreaも呼び出す必要があります。

于 2010-08-19T00:19:11.940 に答える
9

@Serplat とのあなたの談話は、不透明度透明度を混同している可能性があることを示唆しています。

不透明度は、描画を最適化するために使用される Swing コンポーネントのブール型プロパティです。

  • true: コンポーネントは、長方形の境界内に含まれるすべてのビットを描画することに同意します。
  • false: コンポーネントは、長方形の境界内のすべてのビットをペイントすることを保証しません。

透明度は、この例に見られるように、デジタル イメージを合成する手段です。

この違いを考慮することで、質問を明確にしたり、より多くの情報を検索したりするのに役立つ場合があります。

補遺: @camickr のに基づいて、以下の例は、ビューポートに「くっつく」青い正方形を示していますが、灰色のチェッカーボードはその上をスクロールできます。

スクロールペインペイント

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();
            }
        });
    }
}
于 2010-08-19T01:21:21.963 に答える