在以下示例中,我在绿色背景上绘制了自定义JComponent
,但它没有出现。为什么会这样?
public class Test_Background {
public static class JEllipse extends JComponent {
private final Ellipse2D ellipse;
public JEllipse(int width, int height) {
ellipse = new Ellipse2D.Double(0, 0, width, height);
setOpaque(true);
setBackground(Color.GREEN);
}
@Override
public Dimension getPreferredSize() {
return new Dimension((int) ellipse.getBounds().getMaxX(),
(int) ellipse.getBounds().getMaxY());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D) g).draw(ellipse);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JEllipse e = new JEllipse(400, 300);
JFrame f = new JFrame("Background Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(e);
f.pack();
f.setVisible(true);
}
});
}
}
答案 0 :(得分:12)
JComponent不绘制其背景。您可以自己绘制它,也可以使用绘制背景的JPanel
答案 1 :(得分:1)
我记得它只支持这个背景属性,但实际上没有绘制它。 Pum使用g.fillRect(如果这是椭圆,则使用fillEllipse)来创建自己的背景。
答案 2 :(得分:1)
paint()方法有几个问题。
Graphics.setColor()
,所以你画的颜色是完全未知的。你想要更像这样的东西:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(getBackground());
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setColor(getForeground());
g2.draw(ellipse);
}
或者,您可以从JPanel而不是JComponent扩展,它将为您绘制背景,让您只做前景:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(getForeground());
g2.draw(ellipse);
}