java JTextField paintComponent Метод, вызываемый повторно. Это нормально? - PullRequest
0 голосов
/ 11 апреля 2020

имея подкласс JTextField, я заметил, что метод paintComponent вызывается повторно (примерно каждые полсекунды), когда у поля есть фокус, даже без взаимодействия с пользователем.

Я прочитал статью Oracle " Рисуя в AWT и Swing ", но не нашел там никакого просветления.

Это нормальное поведение или что-то пропустили?

Вот мой пример Proggy:
(позиционирование Курсор во 2-м - без подкласса - JTextField, у которого нет ведения журнала, приводит к тому, что подклассовый с регистрацией теряет фокус, который перестает многократно перекрашиваться)

import java.awt.*;
import javax.swing.*;

public class SwingPaintDemo2 extends JFrame {

    public SwingPaintDemo2(final String title) {
        super(title);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Box box = new Box(BoxLayout.Y_AXIS);

        box.add(new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(250, 200);
            }
            @Override
            public void paintComponent(final Graphics g) {
                super  .paintComponent(               g);

                System.out.println("MyPanel.paintComponent......: " + g);

                g.drawString("This is my custom Panel!", 10, 20);
            }
        });
        box.add(new JTextField("JayTekst") {
            @Override
            public void paintComponent(final Graphics g) {
                super  .paintComponent(               g);

                System.out.println("JayTextField.paintComponent.: " + g);
            }
        });
        box.add(new JTextField("JText"));
        this.add(box);
        this.pack();
        this.setVisible(true);
    }
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(() -> new SwingPaintDemo2("Swing Paint Demo"));
    }
}

1 Ответ

1 голос
/ 11 апреля 2020

Конечно это нормально. Когда textfield имеет фокус, вы можете видеть мигание курсора, что означает, что вы видите textfield с новым визуальным представлением, что означает paintComponent().

...