这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言功能的摘要。
请参阅JDK发行说明,了解有关所有JDK发行版的新功能、增强功能以及删除或废弃选项的信息。
问题:我不知道将绘画代码放在哪里。
JComponent
的组件的paintComponent
方法中。问题:我绘制的内容没有显示出来。
repaint
方法。问题:我的组件的前景色显示出来,但背景色是透明的。结果是我组件后面的一个或多个组件意外可见。
JPanel
是不透明的。要使JLabel
和GTK+的JPanel
等组件不透明,你必须在它们上面调用setOpaque(true)
方法。JPanel
或更专门的JComponent
子类,则可以在绘制组件内容之前调用super.paintComponent
方法来绘制背景。paintComponent
方法的顶部绘制背景:
g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(getForeground());
问题:我使用setBackground
设置组件的背景颜色,但似乎没有效果。
JLabel
设置了背景颜色,你还必须在标签上调用setOpaque(true)
使标签的背景被绘制。问题:我使用的是一个教程示例的完全相同的代码,但它不起作用。为什么?
paintComponent
方法中,那么这个方法可能是唯一能保证代码正常工作的地方。问题:如何绘制粗线条?模式?
问题:特定组件的边缘看起来很奇怪。
JPanel
和自定义JComponent
子类之外的组件上调用setBorder
方法。setBorder
。问题:我的GUI中出现了视觉图像问题。
setOpaque
方法来设置组件的不透明度。例如,内容面板必须是不透明的,但具有透明背景的组件不能是不透明的。问题:我的自定义绘制代码性能很差。
Graphics
的getClip
或getClipBounds
方法来确定需要绘制的区域。你绘制得越少,速度就越快。repaint
方法发出绘制请求。问题:对看似相同的Graphics
对象应用相同的变换有时会产生略有不同的效果。
paintComponent
之前设置了变换(使用Graphics
的translate
方法),所以你应用的任何变换都会累积影响。这对于简单的平移不重要,但是对于更复杂的AffineTransform
,可能会产生意想不到的结果。