Настройка панели прокрутки AWT

У меня есть холст AWT (сторонняя библиотека), который отображает некоторую информацию. Мне нужно отобразить панель прокрутки поверх нее. Поскольку холст AWT, мне нужно использовать ScrollPane вместо JScrollPane. Я хотел бы придать области прокрутки закругленную рамку - возможно ли это в AWT? Или я могу каким-либо образом использовать JScrollPane поверх холста и по-прежнему отображать его (я думаю, что последняя версия Java поддерживает лучшее смешивание легковесных/тяжеловесных компонентов, но давайте предположим, что это не вариант).

Спасибо, Джефф


person Jeff Storey    schedule 13.01.2010    source источник
comment
Вы упомянули всплывающие окна в одном из своих комментариев — можете ли вы предоставить более подробную информацию? Всплывающее меню? JPopupMenu? Всплывающее окно/Фабрика всплывающих окон?   -  person Nate    schedule 13.01.2010
comment
В моем приложении вы можете нажимать на элементы на дисплее. При нажатии на элемент всплывает информация о нем. Информации может быть много, поэтому я хочу поместить ее в панель прокрутки. Элемент, по которому щелкают, должен находиться на 3D-холсте, поэтому я пытаюсь отобразить прокручиваемый текст об элементе. В идеале я хотел бы настроить границу всплывающего окна, чтобы придать ему округлый эффект.   -  person Jeff Storey    schedule 13.01.2010
comment
Ну, вы описали, что вы хотите, но я не могу определить, возможно ли то, что вы хотите, потому что я не знаю, какой тип компонентов/классов используется для создания всплывающего окна. Его можно нарисовать прямо на 3D-холсте или использовать один из классов, упомянутых в моем предыдущем комментарии... У вас есть код, в котором запускается всплывающее окно? Или как вы предоставляете контент для всплывающего окна?   -  person Nate    schedule 13.01.2010
comment
В настоящее время я просто создаю ScrollPane, добавляю его на холст и устанавливаю его границы, однако я пишу код для этого, поэтому я могу заставить его делать все, что захочу...   -  person Jeff Storey    schedule 13.01.2010
comment
Вы уже идете об этом так, как вам нужно. Однако, если вы хотите иметь закругленные углы, лучше всего создать свой собственный компонент AWT с полосой прокрутки внутри, которая добавляет границу границы и рисует прозрачные границы. ... Это наводит меня на мысль, что если в AWT есть границы, вы можете указать очень индивидуальную границу, которая не закрашивает весь холст.   -  person Reverend Gonzo    schedule 01.03.2010


Ответы (2)


«Поскольку холст — это AWT, мне нужно использовать ScrollPane вместо JScrollPane».

Почему это? Я думаю, вы можете использовать JScrollPane.

Canvas extends java.awt.Component, а есть конструктор JScrollPane(java.awt.component component)

person Fortega    schedule 13.01.2010
comment
Холст не входит в область прокрутки. Панель прокрутки является частью всплывающего компонента, расположенного поверх холста. - person Jeff Storey; 13.01.2010

Сначала я обдумывал идею использования JScrollPane внутри JPopupMenu с setLightWeightPopupEnabled(false). Однако это всплывает в новом окне верхнего уровня над компонентом, поэтому любые закругленные границы рисуются поверх окна верхнего уровня. Он выглядит как серый прямоугольник с нарисованным сверху JScrollPane с закругленными границами.

Затем я подумал о том, чтобы поместить ScrollPane в Panel, который мог бы обрабатывать закругленную границу вокруг него. К сожалению, компоненты AWT не имеют свойства setOpaque(), как компоненты Swing, поэтому они прямоугольные. Я мог бы скопировать тот же цвет фона, что и у родителя, но если бы вы хотели отобразить его поверх некоторых данных, это было бы довольно очевидно.

Компромиссный подход, к которому я наконец пришел, заключался в том, чтобы компонент Container рисовал границу вокруг дочернего элемента ScrollPane. Это определенно более хакерское решение, но пока это единственное, что сработало... вот окончательный код:

package stackoverflow;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.List;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.ScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class CanvasPopup {

    public static void main(String[] args) {
        final Frame f = new Frame("CanvasPopup");
        final ScrollPane scroll = new ScrollPane();
        final Panel c = new Panel(null) {
            @Override
            public void paint(Graphics g) {
                g.setColor(Color.GREEN);
                g.fillRect(0, 0, getWidth(), getHeight());

                if (scroll.isVisible()) {
                    g.setColor(Color.RED);
                    Rectangle bounds = scroll.getBounds();
                    g.fillRoundRect(bounds.x - 10, bounds.y - 10, 
                            bounds.width + 20, bounds.height + 20, 15, 15);
                }
            }
        };

        final List list = new List();
        for (int i = 0; i<100; i++) {
            list.add("Item " + i);
        }
        scroll.add(list);
        scroll.setBounds(75, 75, 150, 150);
        scroll.setVisible(false);
        c.add(scroll);

        c.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (!scroll.isVisible()) {
                    scroll.setLocation(e.getPoint());
                }
                scroll.setVisible(!scroll.isVisible());
                c.repaint();
            }
        });
        f.add(c);

        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

}  
person Nate    schedule 13.01.2010