亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法從異步方法繪制到 JPanel 上?

有沒有辦法從異步方法繪制到 JPanel 上?

動漫人物 2022-12-21 10:41:46
我正在使用 Swing 和 Firebase 編寫基于 Java 的游戲。我將所有玩家存儲在一個列表中,當他們中的任何一個移動時,onChildChanged(...)回調(見下文)被觸發。由于這是異步的,我顯然不能設置任何超出函數范圍的變量。這一切都很好,直到我需要將這個播放器實際繪制到屏幕上。因為我擴展了 aJPanel并覆蓋了它,所以paintComponent(Graphics g)我必須在這個方法中完成我的所有繪圖(或者至少這是我被告知的)。問題是我需要從回調內部繪制這個玩家,這是我不知道該怎么做的。我試圖將Graphics g對象“導出”到全局變量,然后在異步函數中使用該變量,但這沒有產生任何結果。也許是因為它實際上并沒有繪制到 JPanel 的畫布上?所以我有一個像這樣的類:class Screen extends JPanel {@Overridepublic void paintComponent(Graphics g) {    // All my painting stuff goes here}ref.addChildEventListener(new ChildEventListener() {            // This is the callback            @Override            public void onChildChanged(DataSnapshot snapshot, String previousChildName) {                      // Draw the player                }            }        });}編輯:忘記提及我也在調用repaint()每個游戲滴答聲(每秒 60 次)。我不知道這是否會改變任何東西,但以防萬一:)所以我希望能夠在回調中繪制播放器或在paintComponent()方法中繪制播放器,我想知道如何做到這一點。謝謝!
查看完整描述

1 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

除了在 paintComponent 方法內,你不應該在任何地方繪畫。所以解決方案是:

  • 更新用于告訴 GUI 要繪制什么的模型字段。

  • 如果此更新將以任何其他方式直接影響 GUI,例如更新文本字段、標簽、JTables 等,則應在 EDT 上執行此數據更改,方法是將其放入傳入的 Runnable 中的事件隊列中SwingUtilities.invokeLater(...)

  • 然后打電話repaint()

  • 然后 GUI 將使用這些字段并在 Swing 事件線程上完成所有繪制。

請注意,這repaint()是少數可以從 EDT 調用的 Swing 方法之一


雖然哈哈,但我對更新模型字段的意思有點困惑,你能澄清一下嗎?

如果您正在創建任何復雜的 GUI,您可能會使用模型 - 視圖類型的結構(例如模型 - 視圖 - 控制器的 MVC),其中將程序邏輯(模型部分)與 GUI(視圖)分開。視圖描述了模型的狀態并允許用戶交互,所以我說的是狀態字段。

例如,如果你有一個帶有動畫的游戲,模型將代表玩家的位置、玩家的狀態(生命值、武器、庫存)、他們的行為……而視圖將繪制所有這些基于關于模型的狀態。


查看完整回答
反對 回復 2022-12-21
  • 1 回答
  • 0 關注
  • 69 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號