текст всплывающей подсказки стирает рисунок панели в java

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

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


person Harmeet Singh    schedule 25.08.2011    source источник


Ответы (1)


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

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

person Ernest Friedman-Hill    schedule 25.08.2011
comment
могу ли я сказать, что приложения для рисования сохраняют структуру данных нарисованных объектов в памяти... так ли это? - person Harmeet Singh; 25.08.2011
comment
приложения для рисования поддерживают структуру данных нарисованных объектов в памяти. Обратите внимание, что "структура данных" может быть BufferedImage, как показано в tего ответ. В некотором смысле это проще, но этот подход (список вещей, которые нужно нарисовать) лучше, если вы хотите предложить «отмену» для пользовательских правок. - person Andrew Thompson; 15.09.2012