2

メソッドを使用して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);
}

事前に感謝します....

4

1 に答える 1

3

画面が覆われると、Java が呼び出しpaintComponent()て画面を修正します。メソッド以外で描画す​​るpaintComponent()と、画面が固定されたときに余分な描画が消去されます。

したがって、そのようにしないでください。すべての描画は で行ってくださいpaintComponent()。ユーザーがどこかをクリックしたら、描画したい文字列と座標を何らかのデータ構造 (つまり、各オブジェクトに文字列と座標が含まれるオブジェクトのリスト) に追加してから、 を呼び出しますrepaint()paintComponent()メソッドで、そのデータ構造を調べて文字列を描画します。

于 2011-08-25T12:54:06.850 に答える