如果是Java2D的粉絲;但爲了充分利用Swing組件和佈局中的HTML,我鼓勵您使用@camickr建議的組件方法。如有必要,您可以使用在JTable
,等中看到的輕量級renderer approach,其中單個組件重複用於繪圖。下面的示例是非常簡單的輪廓技術,只更改顏色和位置。
附錄:更新示例;另請參閱CellRendererPane
和Make your apps fly: Implement Flyweight to improve performance。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/7774960 */
public class PaintComponentTest extends JPanel {
private static final int N = 8;
private static final String s = "<html><big><u>Hello</u></html>";
private JLabel renderer = new JLabel(s);
private CellRendererPane crp = new CellRendererPane();
private Dimension dim;
public PaintComponentTest() {
this.setBackground(Color.black);
dim = renderer.getPreferredSize();
this.add(crp);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < N; i++) {
renderer.setForeground(Color.getHSBColor((float) i/N, 1, 1));
crp.paintComponent(g, renderer, this,
i * dim.width, i * dim.height, dim.width, dim.height);
}
}
private void display() {
JFrame f = new JFrame("PaintComponentTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setSize(dim.width * N, dim.height * (N + 1));
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new PaintComponentTest().display();
}
});
}
}
爲什麼不使用JLabel?它支持HTML標籤。 –
我的組件不只是繪製一個html字符串,還有很多其他的繪圖操作,我不想在示例代碼中顯示,只關注真正的問題。 –
'特'如何? '具體'是什麼?這個問題的答案表明,包含更多細節而不是更少是個好主意。 –