Първоначално си играех с идеята да използвам 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