Java - прозрачный JScrollPane - PullRequest
       22

Java - прозрачный JScrollPane

6 голосов
/ 19 августа 2010

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

Вот что у меня так далеко:

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

Ответы [ 3 ]

21 голосов
/ 19 августа 2010

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

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

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

9 голосов
/ 19 августа 2010

Ваш разговор с @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();
            }
        });
    }
}
2 голосов
/ 09 июля 2013

Код для прозрачного фона 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); 
...