我有一個顯示一些信息的AWT畫布(第三方庫)。我需要在上面顯示一個滾動窗格。由於畫布是AWT,我需要使用ScrollPane而不是JScrollPane。我想給這個scrollpane設置一個圓形的邊框 - 在AWT中是否可以這樣做?或者有什麼方法可以在畫布上使用JScrollPane,並且仍然能夠顯示出來(我認爲最新版本的Java支持輕量級/重量級組件的更好混合,但讓我們假設這不是一種選擇)。自定義AWT ScrollPane
感謝, 傑夫
我有一個顯示一些信息的AWT畫布(第三方庫)。我需要在上面顯示一個滾動窗格。由於畫布是AWT,我需要使用ScrollPane而不是JScrollPane。我想給這個scrollpane設置一個圓形的邊框 - 在AWT中是否可以這樣做?或者有什麼方法可以在畫布上使用JScrollPane,並且仍然能夠顯示出來(我認爲最新版本的Java支持輕量級/重量級組件的更好混合,但讓我們假設這不是一種選擇)。自定義AWT ScrollPane
感謝, 傑夫
「既然畫布是AWT,我需要使用一個ScrollPane,而不是一個JScrollPane的。」
這是爲什麼?我認爲你可以使用JScrollPane。
Canvas extends java.awt.Component
,並有一個構造函數JScrollPane(java.awt.component component)
畫布不在滾動窗格中。滾動窗格是位於畫布頂部的彈出組件的一部分。 – 2010-01-13 15:04:47
我最初使用JScrollPane
內JPopupMenu
與setLightWeightPopupEnabled(false)
的想法玩弄周圍。但是,這會在組件上方的新頂層窗口中彈出 - 因此任何圓角邊框都將繪製在頂層窗口的頂部。它看起來像一個灰色的矩形,上面畫有圓形邊框的JScrollPane
。
然後我考慮將ScrollPane
放入Panel
中,它可以處理它周圍的圓形邊框。不幸的是,AWT組件沒有像Swing組件那樣的setOpaque()
屬性,所以它們是矩形的。我可以複製與父項相同的背景顏色,但是如果您想在某些數據的頂部顯示此項,則會非常明顯。
我最終想出的妥協方法是讓Container
組件繪製圍繞ScrollPane
孩子的邊界。這是肯定更多的是黑客-Y的解決方案,但它是唯一一個至今多數民衆贊成工作......這裏的最終代碼:
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);
}
}
您提到您的意見一個彈出窗口 - 你可以提供更多的細節?彈出菜單? JPopupMenu的?彈出/ PopupFactory? – Nate 2010-01-13 15:50:20
在我的應用程序中,您可以點擊顯示屏上的項目。點擊該項目後,會彈出關於該項目的信息。可以有很多信息,所以我想把它放在一個滾動窗格中。被點擊的項目必須位於3D畫布上,所以我正在嘗試顯示有關該項目的可滾動文字。理想情況下,我想自定義彈出框的邊框,使其具有「圓角」效果。 – 2010-01-13 15:52:25
那麼,你描述了你想要的 - 但我不能確定你想要什麼是可能的,因爲我不知道使用什麼類型的組件/類來生成彈出窗口。它可以直接繪製在3D畫布上,或者可以使用我之前評論中提到的其中一個類。您是否有啓動彈出窗口的代碼?或者如何爲彈出窗口提供內容? – Nate 2010-01-13 18:57:53