[英]java event for when the component becomes visible
我有一個圍繞JPanel的JScrollPane,它包含可能有數百個顯示縮略圖圖像的JLabel(每個JLabel一個縮略圖)。 出於內存原因,我不想構建所有縮略圖。 我想僅為可見的JLabel構建縮略圖,並在JLabel變得不可見時刪除縮略圖。 當用戶滾動JPanel時,它們變得可見/不可見。 我嘗試使用ComponentListener實現加載/卸載縮略圖,如下所示:
addComponentListener( new ComponentAdapter() {
@Override
public void componentShown( ComponentEvent e ) {
setIcon( new ImageIcon( getThumb() ) );
}
@Override
public void componentHidden( ComponentEvent e ) {
setIcon( null );
}
});
但這不起作用。 JLabel總是空的。 我可以使用滾動事件並計算應該加載哪些縮略圖但在我這樣做之前我想知道是否有更簡單的解決方案。
“可見”屬性並不意味着“在屏幕上”可見。 它僅指示是否要顯示組件本身。 由於組件在默認情況下是可見的,並且僅在屬性更改時通知偵聽器,因此永遠不會通知偵聽器。
據我所知,當組件進入顯示器的可見區域時,沒有涉及告訴組件的專用事件。 另請注意,在標簽上設置圖標可能會改變其首選大小,從而破壞整個布局。 這可以通過手動為標簽指定固定的首選大小(在縮略圖的情況下應該很簡單)來解決。
一種懶惰的方法是覆蓋標簽上的paintComponent,並檢查是否需要在paintComponent中加載拇指:
protected void paintComponent(Graphics g) {
if (getIcon() == null) {
// create thumbnail
}
super.paintComponent(g);
}
這不是最好的方法,因為您的代碼將在Swings事件派發線程中運行。 這意味着加載縮略圖的任何延遲都將阻止UI的呈現。
一種更為理智的方法IMO只是請求加載縮略圖並將實際加載推遲到后台線程。 當該線程完成加載時,它可以使用SwingUtilities.invoke(或invokeLater)來更新標簽(如果我沒有弄錯的話,它會自動觸發重新繪制)。
效果是滾動的標簽會短暫顯示為空,然后在拇指可用時立即更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.