paintComponent 和paintComponents 区别
时间: 2024-07-03 22:01:15 浏览: 71
`paintComponent` 和 `paintComponents` 都是 Java 用于重绘组件的方法,但在 Swing 和 AWT 库中,它们在处理子组件的方式上有所不同。
1. `paintComponent(Graphics g)`:
这是 Swing 中 `JComponent` 类的默认重写方法。当你直接在一个 Swing 组件上调用这个方法时,它会负责绘制该组件本身的内容。如果你有一个自定义的 JComponent 子类,你需要覆盖这个方法来定制组件的外观。对于单个组件,调用的是 `paintComponent`。
2. `paintComponents(Graphics g)`:
这是 AWT 中 `Container` 类(如 JFrame 或 JApplet)的重写方法。当容器需要重新绘制时,它会遍历其所有子组件,并递归地调用 `paintComponents`。这个方法的主要目的是将绘画责任分发给每个子组件,这样每个组件都会在其自身的 `paintComponent` 内部负责自己的绘制,不需要手动管理。
简而言之,`paintComponent` 通常用于单一组件的定制绘制,而 `paintComponents` 是容器用于管理整个层级结构中所有子组件重绘的过程。在 Swing 中,除非你的组件是容器的一部分,否则你通常使用 `paintComponent`。
相关问题
paintComponent 和paintComponents
`paintComponent`和`paintComponents`是Java Swing库中的方法,它们在处理图形用户界面(GUI)组件的绘制过程中起到关键作用。
1. `paintComponent(Graphics g)`: 这是一个重写自`JComponent`类的方法,通常在自定义组件(如`JPanel`, `JComponent`的子类)中被覆盖。当Swing需要更新组件的可见部分时,会调用这个方法。`Graphics`对象提供了对屏幕进行绘画的接口,包括绘制线条、形状、文本等。在这个方法中,开发者可以编写代码来绘制组件的背景、边框、内容等。每个组件都有自己的`paintComponent`,用于显示特定的定制效果。
2. `paintComponents(Graphics g)`: 这个方法实际上是`JComponent`的默认实现,但有时为了优化性能,尤其是处理大量子组件时,你可以选择重写`paintComponents`。相比于`paintComponent`,`paintComponents`在绘制整个组件树时会调用,它递归地绘制所有的子组件。这对于处理如网格布局或分层容器(如`JLayeredPane`)中的组件很有用,因为它们可能有多个层级的子组件需要渲染。
怎么在Cellcomponent中实现格子随鼠标移动而高亮,且不与selected相冲突public class AnimalComponent extends ChessComponent { private PlayerColor owner; private boolean selected; /* private ChessboardPoint position; public void setPosition(ChessboardPoint position) { this.position = position; } public ChessboardPoint getPosition(){ return position; } */ private static int bluesEaten = 0;//记录被吃掉的蓝色动物数量 public static void setBluesEaten(int bluesEaten){AnimalComponent.bluesEaten = bluesEaten; System.out.println("蓝棋被吃数量" + AnimalComponent.bluesEaten); } public static int getBluesEaten(){return bluesEaten;} private static int redsEaten = 0;//记录被吃掉的红色动物数量 public static void setRedsEaten(int redsEaten){AnimalComponent.redsEaten = redsEaten; System.out.println("红棋被吃数量" + AnimalComponent.redsEaten); } public static int getRedsEaten(){return redsEaten;} public AnimalComponent(PlayerColor owner, int size) { super(owner , size); this.owner = owner; this.selected = false; setSize(size/2, size/2); setLocation(0,0); setVisible(true); } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("楷体", Font.PLAIN, getWidth() / 2); g2.setFont(font); g2.setColor(owner.getColor()); g2.drawString(" ", getWidth() / 4, getHeight() * 5 / 8); // FIXME: Use library to find the correct offset. if (isSelected()) { // Highlights the model if selected. g.setColor(Color.RED); g.drawOval(0, 0, getWidth() , getHeight()); } } }public class CellComponent extends JPanel { private Color background; public CellComponent(Color background, Point location, int size) { setLayout(new GridLayout(1,1)); setLocation(location); setSize(size, size); this.background = background; } @Override protected void paintComponent(Graphics g) { super.paintComponents(g); g.setColor(background); g.fillRect(1, 1, this.getWidth()-1, this.getHeight()-1); } }
你可以在CellComponent类中添加一个MouseListener,然后在鼠标进入和离开的事件中修改组件的背景颜色来实现高亮效果。具体代码如下:
```
public class CellComponent extends JPanel {
private Color background;
private Color hoverColor;
private boolean isHovered;
public CellComponent(Color background, Point location, int size) {
setLayout(new GridLayout(1,1));
setLocation(location);
setSize(size, size);
this.background = background;
this.hoverColor = new Color(255, 255, 0, 100); // 设置高亮颜色为半透明黄色
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
isHovered = true;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
isHovered = false;
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponents(g);
g.setColor(background);
g.fillRect(1, 1, this.getWidth()-1, this.getHeight()-1);
if (isHovered) {
g.setColor(hoverColor);
g.fillRect(1, 1, this.getWidth()-1, this.getHeight()-1);
}
}
}
```
注意,这里的高亮颜色是使用一个半透明的黄色来实现,可以根据需要自行调整。同时,由于高亮效果是在鼠标进入和离开的事件中触发的,因此不会与selected属性产生冲突。
阅读全文