我正在使用 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(視圖)分開。視圖描述了模型的狀態并允許用戶交互,所以我說的是狀態字段。
例如,如果你有一個帶有動畫的游戲,模型將代表玩家的位置、玩家的狀態(生命值、武器、庫存)、他們的行為……而視圖將繪制所有這些基于關于模型的狀態。
添加回答
舉報
0/150
提交
取消