Java - Прозрачная JScrollPane

У меня есть JTextArea, и он едет поверх JScrollPane. В любом случае, я знаю, что могу использовать метод getViewPort () , чтобы установить непрозрачность порта просмотра ... но я не могу найти никаких признаков того, как это сделать ... где-либо. : S

Вот что у меня есть:

 if (e.getKeyCode() == KeyEvent.VK_F)
{
    if (sp.isVisible())
    {
        sp.setVisible(false);
    }
    else
    {
        sp.setVisible(true);
    }
}
6
задан trashgod 19 August 2010 в 00:58
поделиться

2 ответа

Ваш разговор с @Serplat наводит на мысль, что вы путаете opacity и transparency.

Opacity - это булево свойство компонентов 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();
            }
        });
    }
}
9
ответ дан 8 December 2019 в 02:52
поделиться

Вам нужно использовать setOpaque(false), чтобы сделать его прозрачным. Вызовите это как на JScrollPane, так и на ее ViewPort.

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

Вам также придется вызвать setOpaque(false) для JTextArea, если вы хотите, чтобы она также была прозрачной.

21
ответ дан 8 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: