Выбор текста в Graphics/Graphics2D

Выбор текста с помощью Graphics/Graphics2D

Как выделить текст из строки с помощью мыши при его рендеринге в Graphics?

Привет, я разрабатываю элементы управления пользовательского интерфейса для программного обеспечения, которое я делаю на JAVA. Я визуализирую все, используя Graphics/Graphics2D, и мне нужна небольшая помощь с проблемой, с которой я столкнулся. У меня есть управление текстовым полем, так что вы можете печатать и возвращать текст. Следующая проблема, с которой я столкнулся, — это возможность выделить части этого текста. Я не совсем уверен, с чего мне начать в этом вопросе. Ниже я опубликую в своих элементах управления код рендеринга и код ввода.

Код рендеринга

@Override
public void render(Graphics g) {

    // Draw Fill
    Graphics2D g2 = (Graphics2D) g.create();
    if (isActive) {
        g2.setPaint(new GradientPaint(new Point(x, y), Colors.textboxActiveTop, new Point(x, y + h), Colors.textboxActiveBottom));
    } else {
        g2.setPaint(new GradientPaint(new Point(x, y), Colors.textboxTop, new Point(x, y + h), Colors.textboxBottom));
    }
    g2.fillRect(x, y, w, h);

    // Draw Text
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    if (isPassword) {
        int count = text.toString().length();
        for (int i = 0; i < text.toString().length(); i++) {
            g2.setColor(Colors.white50percent);
            g2.fillArc(x + (w / 2) + (i * 5) - ((count * 5) / 2), y + (h / 2), 4, 4, 0, 360);
            g2.setColor(foreColor);
            g2.fillArc(x + (w / 2) + (i * 5) - ((count * 5) / 2), y + (h / 2) - 1, 4, 4, 0, 360);
        }
    } else {
        if (isCentered) {
            g2.setColor(Colors.white50percent);
            g2.drawString(text.toString(), x + (w / 2) - (g.getFontMetrics().stringWidth(text.toString()) / 2), y + (h / 2) + (g.getFontMetrics().getMaxAscent() / 2) + 1);
            g2.setColor(foreColor);
            g2.drawString(text.toString(), x + (w / 2) - (g.getFontMetrics().stringWidth(text.toString()) / 2), y + (h / 2) + (g.getFontMetrics().getMaxAscent() / 2));
        } else {
            g2.setColor(Colors.white50percent);
            g2.drawString(text.toString(), x + 5, y + (h / 2) + (g.getFontMetrics().getMaxAscent() / 2) + 1);
            g2.setColor(foreColor);
            g2.drawString(text.toString(), x + 5, y + (h / 2) + (g.getFontMetrics().getMaxAscent() / 2));
        }
    }
    // Draw Border
    g.setColor(Colors.borderColor);
    g.drawRect(x, y, w, h);

    // Draw Hightlights
    g.setColor(Colors.white50percent);
    g.drawRect(x + 1, y + 1, w - 2, h - 2);
    g.drawRect(x - 1, y - 1, w + 2, h + 2);
}

Ввод кода

@Override
public void keyTyped(KeyEvent e) {
    int code = (int) e.getKeyChar();
    if (isActive) {
        if (code == 8) {
            if (text.toString().length() >= 1) {
                text = text.toString().substring(0, text.toString().length() - 1);
            }
        } else {
            String character = "" + (char)code;
            if(acceptedCharacters.contains(character.toLowerCase()))
                text = text.toString() + (char) code;
        }
    }
}

person Matthew D Auld    schedule 19.07.2013    source источник
comment
1) Вы описали проблему, но пока не задали вопрос (не говоря уже о конкретном вопросе, на который можно было бы ответить). Какой у вас ваш вопрос? 2) Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 19.07.2013
comment
Как выделить текст из строки с помощью мыши при его рендеринге в Graphics?   -  person Matthew D Auld    schedule 19.07.2013
comment
How do I select text from a string using the mouse when it's rendering in Graphics? — дублировать код, найденный в существующем компоненте текстового поля Swing. Или вы можете просто использовать JTextField.   -  person camickr    schedule 19.07.2013


Ответы (1)


Как выделить текст из строки с помощью мыши при его рендеринге в Graphics?

Добавьте MouseListener и когда срабатывает, проверьте, находится ли он в пределах String.

Способы проверки границ String:

person Andrew Thompson    schedule 19.07.2013
comment
Я попробую этот метод и опубликую ответ, если найду результаты. - person Matthew D Auld; 19.07.2013