Alex_P97
@Alex_P97
Программист любитель

Как правильно стилизовать JTextField?

Есть прозрачное окно.
package ru.alexp.tools;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JFrame;

public class InputFrame extends JFrame {

    private static InputFrame instance;

    private final ConsoleInputPanel inputPanel = new ConsoleInputPanel();

    public InputFrame() {
        final Dimension dim = getToolkit().getScreenSize();
        setSize(500, 80);
        setLocation(dim.width - getWidth() - 50, dim.height - getHeight() - 200);
        setUndecorated(true);
        setBackground(new Color(255, 255, 255, 0));
        setType(Type.UTILITY);
        add(inputPanel);

        addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                repaint();
            }

            @Override
            public void focusLost(FocusEvent e) {
                repaint();
            }
        });
    }

    public static InputFrame getInputFrame() {
        if (instance == null) {
            instance = new InputFrame();
        }
        return instance;
    }
}


В нём нахордится панель на которой отрисовывается стилизованный JTextField.
Для перерисовки содержимого JTextField я перезаписываю paintComponent(Graphics g).
protected void paintComponent(Graphics g) {
    Graphics2D gg = (Graphics2D) g;
    gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    gg.setColor(Color.WHITE);
    gg.setFont(font);
    gg.drawString(getText(), 50, 50);
}

При первой отрисовки текста всё отлично работает. Но при при отрисовки другого текста у меня на экране показывается наложение этих отрисованных строк.
222cdb05c6b444b6a0d070d1dfec7984.png
(здесь было написано сначала "12345" затем "5432111")

Сразу были найдены возможные решения:
  • Перед отрисовкой очищать область через clearRect() -> получил белую область под элементом
  • Перерисовывать содержимое полностью содержимое используя repaint() в paintComponent() -> получил бесконечную рекурсию (да, знаю. глупо. но так InputFrame.getInputFrame().repaint() кое как но работало.)
  • реализовать через super.paintComponent() -> белый фон; чтобы убрать белый фон setBackground(new Color(255, 255, 255, 0)) -> опять наложение отрисованных строк


Помогите решить эту проблему и подскажите как правильно реализовать остальные визуальные функции JTextField такие как: мигание курсора и выделение символов.
Заранее спасибо.
  • Вопрос задан
  • 706 просмотров
Пригласить эксперта
Ответы на вопрос 1
Alex_P97
@Alex_P97 Автор вопроса
Программист любитель
protected void paintComponent(Graphics g) {
    g.setColor(new Color(255, 255, 255, 0));
    g.clearRect(0, 0, getWidth(), getHeight());
    Graphics2D gg = (Graphics2D) g;
    gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    gg.setColor(Color.WHITE);
    gg.setFont(font);
    gg.drawString(getText(), 15, 50);
}

917e22546f52495b9ce9835267658c97.PNG
Не очень помогло.

А не стоит ли использовать для таких окон javafx?

Если в JavaFX найду достойную замену Swing'овскому GroupLayout, а не GridPanel. Сразу перейду.
Но всё равно спасибо. Посмотрю что можно сделать с JavaFX.
(Таки, пока вопрос остаётся открытым. Мне нужно Swing'овское решение.)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы