Ограничьте размер входного текста в панели PLAIN_MESSAGE JOptionPane - PullRequest
0 голосов
/ 08 мая 2018

Я создаю диалоговое окно, используя метод JOptionPane.showInputDialog() с типом параметра JOptionPane.PLAIN_MESSAGE. Это отображает всплывающее окно подтверждения со свободным текстовым полем ввода. Мне нужно, чтобы текст был не более 256 символов, но я не могу найти никакой возможности ограничить его при объявлении диалога.

В данный момент я проверяю длину возвращаемой строки и усекаю ее, если она слишком длинная:

private void showConfirmationPopup(Component parent) {
    String title = "";
    String message = "";
    String defaultComment = "";
    // Open an Input Dialog with a Text field
    Object comment = JOptionPane.showInputDialog(
            parent,
            message, 
            title, 
            JOptionPane.PLAIN_MESSAGE,
            null,
            null,
            defaultComment);

    if(comment != null) {
        String inputComment = (String)comment;
        if(inputComment.length()>256) {
            inputComment = inputComment.substring(0, 256);
        }
        // ...
    }
}

Мне интересно, можно ли установить предел при объявлении диалога или есть хитрый трюк для его достижения, поэтому мне не нужно делать проверку позже.

1 Ответ

0 голосов
/ 08 мая 2018

Прочтите раздел из учебника по Swing на Остановка автоматического закрытия диалога .

Показывает, как вы можете редактировать введенный текст и не допускать закрытия диалогового окна, если не введены правильные данные.

Edit:

Вы можете попробовать получить доступ к текстовому полю панели параметров:

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

public class OptionPaneInput2
{
    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

        JTextField label = new JTextField("How old are you?");
        label.addAncestorListener( new AncestorListener()
        {
            @Override
            public void ancestorAdded(AncestorEvent e)
            {
                Component component = e.getComponent();
                Container parent = component.getParent();
                JTextField textField = (JTextField)parent.getComponent(1);
                System.out.println("added");
            }

            @Override
            public void ancestorMoved(AncestorEvent e) {}

            @Override
            public void ancestorRemoved(AncestorEvent e) {}

        });


        //  Simple text field for input:

        String age = JOptionPane.showInputDialog(
            frame,
            label);

        frame.dispose();
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater( () -> createAndShowGUI() );
/*
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

Указав сообщение как JLabel, вы можете получать уведомления, когда метка добавляется в диалоговое окно, а затем вы можете получить доступ к текстовому полю ввода и добавить DocumentFilter к Document текстового поля и выполнить необходимые действия. редактирования.

См. Учебник Swing по Реализация DocumentFilter , чтобы узнать фильтр, ограничивающий количество отображаемых символов.

Если это все еще слишком креативно для вас, я бы посоветовал вам просто создать свой собственный JDialog. Это действительно лучший подход.

...