![](/img/trans.png)
[英]Why won't repaint() always call paintComponent and why it doesn't always behave properly when it's called
[英]I don't know why my object is becoming null. Also, why does repaint() not always call paintComponent()?
我试图让用户用鼠标绘制一个矩形。
我有两个问题,我认为可能与此有关。 首先,我在这里发布的第三个类Color.java需要使用鼠标监听器中的相同矩形对象,这是我提供的第二个类(Mouse.java)。
我尝试使用getter和setter,当我在调试模式下完成程序时,它在color()方法中有正确的矩形对象,但是一旦它转到paintComponent(),我现在有一个空矩形对象。 我不知道为什么会这样。
我遇到的另一个问题是repaint()方法并不总是调用paintComponent()方法。 我想这可能是因为矩形对象为null但我不确定。
我试图缩短代码并用注释替换一些代码。 我也没想到包括矩形类是必要的,因为大多数类都充满了与这个问题完全无关的其他函数。
任何有助于我朝着正确方向前进的帮助都会受到赞赏,我现在非常困难。 谢谢!
public class JavaSwing extends JFrame implements ItemListener {
//Checkbox objects here
Colors colors = new Colors();
public void createGui() {
intersection = new JCheckBox("Draw Intersections");
intersection.setMnemonic(KeyEvent.VK_C);
intersection.setSelected(false);
//checkbox objects assigned like above
//checkbox listeners
JFrame frame = new JFrame("Rectangles");
frame.setSize(600, 600);
frame.setVisible(true);
Mouse mouse = new Mouse();
colors.setLayout(new BoxLayout(colors, BoxLayout.PAGE_AXIS));
colors.addMouseListener(mouse);
colors.addMouseMotionListener(mouse);
colors.add(Box.createRigidArea(new Dimension(0, 5)));
colors.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
JButton button = new JButton("Clear Image");
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
panel.add(Box.createHorizontalGlue());
panel.add(intersection);
panel.add(Box.createRigidArea(new Dimension(10, 0)));
panel.add(union);
panel.add(Box.createRigidArea(new Dimension(10, 0)));
panel.add(commonArea);
panel.add(Box.createRigidArea(new Dimension(10, 0)));
panel.add(button);
frame.add(colors, BorderLayout.CENTER);
frame.add(panel, BorderLayout.PAGE_END);
}
@Override
public void itemStateChanged(ItemEvent e) {
//for checkboxes
}
public static void main(String args[]) {
JavaSwing javaSwing = new JavaSwing();
javaSwing.createGui();
}
}
第二类:
public class Mouse extends MouseInputAdapter implements MouseListener{
Rectangle rectangleOne = new Rectangle(0, 0, 0, 0);
Colors colors = new Colors();
public void mousePressed(MouseEvent e) {
rectangleOne.setX(e.getX());
rectangleOne.setY(e.getY());
rectangleToDraw = new Rectangle(rectangleOne.getX(), rectangleOne.getY(),
rectangleOne.getWidth(), rectangleOne.getHeight());
colors.setRectangle(rectangleToDraw);
colors.color();
}
public void mouseReleased(MouseEvent e) {
int x2 = e.getX();
int y2 = e.getY();
rectangleOne.setWidth(x2 - rectangleOne.getX());
rectangleOne.setHeight(y2 - rectangleOne.getY());
rectangleToDraw = new Rectangle(rectangleOne.getX(), rectangleOne.getY(),
rectangleOne.getWidth(), rectangleOne.getHeight());
colors.setRectangle(rectangleToDraw);
colors.color();
}
第三类:
public class Colors extends JPanel {
Rectangle rectangle;
public void setRectangle(Rectangle rectangle)
{
this.rectangle = rectangle;
}
public Rectangle getRectangle() {
return rectangle;
}
public void color() {
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
if (getRectangle() != null) {
g.fillRect(getRectangle().getX(), getRectangle().getY(), getRectangle().getWidth(), getRectangle().getHeight());
}
}
}
究其原因rectangle
,当你达到是空paintComponent
是因为colors
的Mouse
不一样的colors
在JavaSwing
。 在这两个类中,您都可以使用Colors colors = new Colors()
。 这意味着你有两个独立的,无关的类实例。 这也是你在调用repaint()
时没有看到重绘的原因 - 你在一个不属于显示的实际组件层次结构的组件上调用它。
如果您更改了内容以便在两种情况下都使用相同的Colors
实例,它将正常工作。 因此,将Mouse
代码更改为:
public class Mouse extends MouseInputAdapter implements MouseListener{
Rectangle rectangleOne = new Rectangle(0, 0, 0, 0);
Colors colors;
public Mouse(Colors colors){
this.colors = colors;
}
/* The rest of your methods here */
}
然后像这样创建您的Mouse实例:
Mouse mouse = new Mouse(colors);
另外,虽然我不认为这就是你所说的,但我想我应该提一下, repaint()
并不总是会导致paintComponent
被调用,即使你在正确的对象上进行调用也是如此。 它的作用是在下一次事件调度线程时发出重新绘制组件的请求。 通常它会导致paintComponent被调用,但并不总是(例如,如果组件不可见,或者如果在重新绘制它之前多次调用它,这将导致它只被绘制一次)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.