簡體   English   中英

停止JButton重新繪制鼠標?

[英]Stop JButton repainting on mouse over?

我創建了一個自定義JButton類來表示壟斷板上的空間。 游戲是多人游戲,所以繪制按鈕所需的大量信息都保存在服務器上(通過RMI訪問)。

我的問題是當我將鼠標懸停在按鈕上時,它會自動調用repaint()(並繪制邊框)。 這使程序非常慢,因為每次鼠標懸停在其中一個空間上時,必須從服務器上取出數據。

我一直試圖找到一種方法來阻止這種情況發生,但互聯網上的其他人似乎都有問題,讓按鈕重繪()而不是停止它。

有誰知道我可以覆蓋的方法或我可以改變的屬性來阻止這種情況發生?

我建議重新考慮你的設計。 我承認我不知道所有因素在起作用,但是根據你的描述,我認為電路板的狀態不會經常發生變化,所以沒有理由在每次塗漆時調用服務器。 相反,如果您的服務器向客戶端廣播游戲事件,那么在進行repaint調用時,您將獲得本地所需的狀態。

此外,從您的描述中,聽起來好像您可以從repaint代碼中調用服務器,由鼠標事件觸發。 這很好,可以在EDT中完成。 您不應該在繪圖線程中進行服務器調用,因為它會減慢GUI的其余部分。 應該在工作線程中進行長時間運行的調用。 有關更多詳細信息,請查看SwingWorkerSwing中的線程概念

即便如此,我也不認為弄亂重繪邏輯會是最好的行動方案。 為按鈕提供渲染所需的內容是更好的一步。

在swing組件的repaint()(和paint())方法中永遠不應該有大的計算,更不用說服務器調用了......

當然你可以,但不是直截了當。

無論你想在JButton上繪制什么,都要將它轉儲到BufferedImage中。 JButton的paint()應該基本上返回一個緩沖的圖像。 重繪時BufferedImages非常快,它們只是一個像素矩陣,重繪之間幾乎不需要時間。

package test;

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonTest {
    public static void main(String[] args){
        new ButtonTest().test();
    }

    public void test(){
        JFrame frame = new JFrame("TestFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pnl = new JPanel();
        pnl.add(new MyButton());
        frame.add(pnl);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class MyButton extends JButton{
        public void paint(Graphics g){
            //return a buffered image everytime
        }
    }
}

雖然上面的技術看起來有點愚蠢,但你基本上可以在內存中有一個緩沖圖像,並且應該從paint()方法返回。 並且您從服務器(RMI)接收的任何內容都可以使用在后台運行的單獨線程轉儲到BufferedImage對象中。

你試過禁用焦點邊框的繪畫嗎? 有關詳細信息,請查看JButton API文檔

此外,您可以嘗試緩存按鈕上顯示的數據。 並且,按鈕是否真的適合您要做的事情? 請記住,用戶希望已知的GUI元素以非常特定的方式做出反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM