Персонализиране на AWT ScrollPane

Имам AWT платно (библиотека на трета страна), което показва известна информация. Трябва да покажа панел за превъртане над него. Тъй като платното е AWT, трябва да използвам ScrollPane вместо JScrollPane. Бих искал да дам на екрана за превъртане закръглена граница - това изобщо възможно ли е в AWT? Или има ли някакъв начин да използвам JScrollPane върху платното и все още да се показва (мисля, че най-новата версия на Java поддържа по-добро смесване на леки/тежки компоненти, но нека приемем, че това не е опция).

Благодаря, Джеф


person Jeff Storey    schedule 13.01.2010    source източник
comment
Споменахте изскачащи прозорци в един от вашите коментари - можете ли да предоставите повече подробности? Изскачащо меню? JPopupMenu? Popup/PopupFactory?   -  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 компонент с ScrollBar вътре, който добавя марж на границата и рисува прозрачни граници. ... Което ми дава идея, ако 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