У меня есть JTextArea, и он едет поверх JScrollPane. В любом случае, я знаю, что могу использовать метод getViewPort ()
, чтобы установить непрозрачность порта просмотра ... но я не могу найти никаких признаков того, как это сделать ... где-либо. : S
Вот что у меня есть:
if (e.getKeyCode() == KeyEvent.VK_F)
{
if (sp.isVisible())
{
sp.setVisible(false);
}
else
{
sp.setVisible(true);
}
}
Ваш разговор с @Serplat наводит на мысль, что вы путаете opacity и transparency.
Opacity - это булево свойство компонентов 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();
}
});
}
}
Вам нужно использовать setOpaque(false)
, чтобы сделать его прозрачным. Вызовите это как на JScrollPane, так и на ее ViewPort.
sp.setOpaque(false); sp.getViewport().setOpaque(false);
Вам также придется вызвать setOpaque(false)
для JTextArea, если вы хотите, чтобы она также была прозрачной.