Как добавить поле jtext в jpanel с компонентом рисования? - PullRequest
0 голосов
/ 04 мая 2019

Я делаю игру и хочу добавить JTextField в JPanel с компонентом Paint.Я перекрашиваю JPanel каждые 16 миллисекунд.

Я добавляю () текстовое поле к панели, но оно появляется только для одного кадра, когда я нажимаю на него.Затем я попытался перекрасить () текстовое поле, но теперь оно мигает.

public class Screen extends JPanel {


    public Screen() {
        JTextField txt = new JTextField();
        txt.setBounds(10, 10, 300, 50);
        this.add(txt);
    }
    @Override
    public void paint(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;

        g2D.setColor(Color.BLACK);
        g2D.fillRect(0, 0, this.getWidth(), this.getHeight());

        g2D.setColor(Color.WHITE);
        g2D.fillRect(0, 0, this.getWidth(), 20);

        txt.repaint();
    }
}

Я хочу показать текстовое поле в верхней части панели

Ответы [ 2 ]

1 голос
/ 05 мая 2019
JTextField txt = new JTextField();

Когда вы создаете JTextField, вы должны использовать код, подобный следующему:

JTextField txt = new JTextField(10);

Теперь текстовое поле может рассчитывать свой собственный предпочтительный размер.

//txt.setBounds(10, 10, 300, 50);

Не использоватьsetBounds (), чтобы дать компоненту размер.Опять же, каждый компонент Swing отвечает за определение своего предпочтительного размера.Затем менеджер макета установит размер / расположение компонента на панели.

//public void paint(Graphics g) {
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);

    // add custom painting here
}

Не переопределяет paint ().Выборочная окраска выполняется путем переопределения метода paintComponent ().И первое утверждение в методе должно быть super.paintComopnent (g)

//g2D.setColor(Color.BLACK);
//g2D.fillRect(0, 0, this.getWidth(), this.getHeight());

Не рисовать фон панели.Это работа панели, и поэтому вам нужно использовать super.paintComponent (), чтобы убедиться, что фон закрашен.

Затем в конструкторе вашего класса JPanel вы просто используете setBackground( Color.BLACK )

//txt.repaint();

Никогда не вызывайте repaint () для любого компонента в методе рисования.

Прочтите раздел из учебного пособия по Swing по Custom Painting , где приведены рабочие примеры для начала работы.Используйте демо-код в качестве отправной точки для вашей программы.Затем вы просто добавляете JTextField на панель, так что это будет одна строка кода, необходимая для отображения текстового поля.

0 голосов
/ 04 мая 2019

Похоже, вы хотите иметь JTextField на черной панели. Вам не нужно каждый раз устанавливать цвет панели в методе paint (). Вместо этого добавьте это в конструктор:

public Screen() {
    setOpaque(true);
    setBackground(Color.BLACK);
    //... 
}

и удалите метод paint ().

Кроме того, если вы хотите использовать абсолютное позиционирование с методом setBounds (), вам следует установить в конструкторе значение null setLayout(null) в конструкторе. Если вы используете абсолютное позиционирование, вам также нужно явно указать размер панели. Тем не менее, я бы по-прежнему предлагал вам использовать менеджер макетов, который также заботится о размерах панели. См. этот пост для получения дополнительной информации об абсолютном позиционировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...