【问题标题】:tooltip text erases panel drawing in java工具提示文本擦除Java中的面板绘图
【发布时间】:2011-11-03 16:11:37
【问题描述】:

我有一个JPanel,在其上使用paintComponent 方法执行一些绘图,之后当用户单击JPanel 时,会在其上绘制一个字符串(或任何绘图)并且当用户移动鼠标时在JPanel 上方,它在JPanel 的工具提示中显示坐标。

1) 问题是,当工具提示出现在绘制的字符串上时,它会擦除​​它,但是这个工具提示文本对我在paintComponent 方法中执行的绘图部分没有擦除效果。我无法理解为什么会这样。

2) 当我在点击时绘制字符串然后最小化并恢复我的应用程序时,我绘制的字符串消失了。

希望大家明白我的意思。

代码如下:

@Override
public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    Graphics2D graphics2D = (Graphics2D) graphics;
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

    drawBorder(graphics2D);
    drawGrid(graphics2D);
}

private void drawBorder(Graphics2D graphics2D) {
    graphics2D.setColor(Color.ORANGE);
    graphics2D.setStroke(new BasicStroke(borderStroke));
    graphics2D.drawRoundRect(panelStartLoc.x, panelStartLoc.y, panelBorder.width,
            panelBorder.height, borderRoundness, borderRoundness);
}

private void drawGrid(Graphics2D graphics2D) {
    graphics2D.setColor(Color.ORANGE);
    graphics2D.setStroke(new BasicStroke(gridCellStroke));

    for (int row = gridStartLoc.x; row < panelBorder.getWidth(); row += cellWidth + cellHorGap) {
        for (int col = gridStartLoc.y; col < panelBorder.getHeight(); col += cellHeight + cellVerGap) {
            graphics2D.drawRoundRect(row, col, cellWidth, cellHeight, cellRoundness, cellRoundness);
        }
    }
}

public void drawSubjectAtClickLoc(int subjectCode) {
    Color color = getBackground();
    String drawString = null;
    int subjectDrawXLoc = cellClickLoc.x + 4;
    int subjectDrawYLoc = (cellClickLoc.y + cellHeight) - 3;
    Graphics2D graphics2D = (Graphics2D) getGraphics();

    if (subjectCode == SUBJECT_CLEAR) {
        graphics2D.setColor(getBackground());
        graphics2D.fillRoundRect(cellClickLoc.x + 2, cellClickLoc.y + 2, cellWidth - 4, 
                cellHeight - 4, cellRoundness, cellRoundness);
        return;
    }
    if (subjectCode == SUBJECT_HUMAN) {
        color = Color.WHITE;
        drawString = "H";
    }
    if (subjectCode == SUBJECT_RESOURCE) {
        color = Color.GREEN;
        drawString = "R";
    }

    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    graphics2D.setFont(new Font(null, Font.BOLD, 26));
    graphics2D.setColor(color);
    graphics2D.drawString(drawString, subjectDrawXLoc, subjectDrawYLoc);
}

提前谢谢....

【问题讨论】:

    标签: java swing graphics drawstring paintcomponent


    【解决方案1】:

    当你的屏幕被覆盖时,Java 调用paintComponent() 来修复屏幕。如果您在paintComponent() 方法之外进行绘制,那么当屏幕固定时,您的额外绘制将被删除。

    所以不要那样做:在paintComponent() 中完成所有绘图。当用户单击某处时,将要绘制的字符串和坐标添加到某种数据结构(即对象列表,每个对象包含一个字符串和一些坐标),然后调用repaint()。在您的 paintComponent() 方法中,查看该数据结构并绘制字符串。

    【讨论】:

    • 所以我可以说绘图应用程序在内存中维护绘制对象的数据结构..是这样吗?
    • “绘图应用程序在内存中维护绘制对象的数据结构。” 请注意,“数据结构”可能是 BufferedImage,如 this answer 所示。在某些方面它更容易,但如果您希望为用户编辑提供“撤消”功能,这种方法(要绘制的内容列表)会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2014-11-28
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多