もちろんできますが、簡単ではありません。
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
}
}
}
上記の手法は少しばかげているように見えますが、基本的にはメモリ内に 1 つのバッファリングされた画像を持つことができ、それは paint() メソッドから返される必要があります。また、サーバー (RMI) から受け取ったものはすべて、バックグラウンドで実行されている別のスレッドを使用して BufferedImage オブジェクトにダンプできます。