Текст всплывающей подсказки стирает рисование панели в Java - PullRequest
2 голосов
/ 25 августа 2011

У меня есть 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);
}

Спасибо заранее ....

1 Ответ

3 голосов
/ 25 августа 2011

Когда ваш экран закрыт, Java вызывает paintComponent(), чтобы исправить экран.Если вы рисуете вне метода paintComponent(), то после исправления экрана ваши дополнительные рисунки будут стерты.

Так что не делайте так: делайте все свои рисунки в paintComponent(),Когда пользователь щелкает где-то, добавьте строку, которую вы хотите нарисовать, и координаты в какую-либо структуру данных (т. Е. Список объектов, каждый из которых содержит строку и некоторые координаты), затем вызовите repaint().В вашем методе paintComponent() посмотрите на эту структуру данных и нарисуйте строки.

...