JScrollPane внутри JLayeredPane не перерисовывается?

Это может быть что-то очень простое, но я совершенно запутался.

У меня есть JScrollPane внутри JLayeredPane, когда я прокручиваю панель, то, что выше в JLayeredPane, вообще не перерисовывается.

Здесь я получил небольшой пример уведомления о том, что синий квадрат вообще не перекрашивается.

Я совершенно неправильно понял, как работает многоуровневая панель?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class LayeredTest extends JPanel{

    public LayeredTest(){

        JPanel content = new JPanel();
        content.setBackground(Color.red);
        content.setPreferredSize(new Dimension(2048, 2048));
        content.setBounds(0, 0, 2048, 2048);
        JPanel control = new JPanel();
        control.setBackground(Color.blue);
        control.setPreferredSize(new Dimension(200, 50));
        control.setBounds(0, 0, 100, 50);

        JScrollPane scroll = new JScrollPane(content);
        scroll.setBounds(0, 0, 400, 400);

        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(400, 400));

        layeredPane.add(control, 0);
        layeredPane.add(scroll, 1);

        this.add(layeredPane, BorderLayout.CENTER);
    }


    public static void main(String[] args) {
        //Create and set up the window.
        JFrame frame = new JFrame("Test - Very lulz");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.setSize(400, 400);

        //Create and set up the content pane.
        frame.setContentPane(new LayeredTest());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
}

Любые идеи?


person larlin    schedule 28.08.2011    source источник


Ответы (1)


Что вы делаете, так это добавляете компоненты control и scroll к слою «по умолчанию», так что фактически они все еще находятся на одном слое. Чтобы разместить их на разных слоях, необходимо также указать номер слоя. Лучше всего размещать компоненты где-то между слоем по умолчанию (который является самым нижним с индексом 0) и следующим слоем, который является слоем «палитра» с индексом 100.

Итак, чтобы поместить компоненты на слои 50 и 51, например, измените место добавления компонентов в layeredPane на:

    layeredPane.add(scroll, 50, 0);
    layeredPane.add(control, 51, 0);

Это поместит scroll в позицию 0 на слое 50 и control в позиции 0 на слое 51.

person cgull    schedule 28.08.2011
comment
Спасибо за ответ, кажется, работает! Я полностью упустил из виду, что индекс не был индексом слоя. Идеальный ответ! - person larlin; 29.08.2011