Диалоговое сообщение изменения размера (JOptionPane) для длинного предложения с фиксированной шириной

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

Мой код ..

public class DialogTest {
public static void main(String[] args) throws Exception {
    JTextPane jtp = new JTextPane();
    Document doc = jtp.getDocument();
    for (int i = 0; i < 50; i++) {
        doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
        if ((3 == i) || (7 == i) || (15 == i)) {
            doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
            SimpleAttributeSet attrs = new SimpleAttributeSet();
            StyleConstants.setUnderline(attrs, true);
            StyleConstants.setForeground(attrs, Color.BLUE);
            String text = "www.google.com";
            URL url = new URL("http://" + text);
            attrs.addAttribute(HTML.Attribute.HREF, url.toString());
            doc.insertString(doc.getLength(), text, attrs);
        }
    }
    JScrollPane jsp = new JScrollPane(jtp);
    jsp.setPreferredSize(new Dimension(480, 150));
    jsp.setBorder(null);

    JOptionPane.showMessageDialog(null, jsp, "Title", JOptionPane.INFORMATION_MESSAGE);
}}

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

И я хочу настроить высоту в зависимости от длины текста.

Если я запускаю этот код, я вижу вертикальную полосу прокрутки. Но я не хочу показывать эту полосу прокрутки и регулировать высоту диалогового окна.


person swordartist    schedule 27.02.2014    source источник
comment
хм.. Я не нашел ответа для себя в теме.   -  person swordartist    schedule 27.02.2014
comment
Суть в том, что вы не должны использовать setPreferredSize (он не делает того, что вы думаете). Извините, что не предложил альтернативный подход, но сейчас у меня мало времени.   -  person Kevin Panko    schedule 27.02.2014
comment
1) Чтобы быстрее получить помощь, опубликуйте MCTaRE (минимальный полный проверенный и читаемый пример). 2) Какой тип документа, HTML? Если это так, вы можете использовать ту же технику, что и в этом ответе.. (но если вы не можете заставить ее работать, опубликуйте MCTaRE, а не некомпилируемые фрагменты кода).   -  person Andrew Thompson    schedule 28.02.2014
comment
java-sl.com/tip_text_height_measuring.html   -  person StanislavL    schedule 28.02.2014
comment
спасибо всем, кто потратил время на мой вопрос, user1967800 дал мне ответ, который я искал.   -  person swordartist    schedule 28.02.2014


Ответы (2)


Чтобы исправить ширину и адаптировать высоту, я лично использую этот трюк: вы фиксируете произвольную высоту и целевую ширину с помощью setSize, а затем получаете ожидаемую высоту с помощью getPreferredSize():

jtp.setSize(new Dimension(480, 10));
jtp.setPreferredSize(new Dimension(480, jtp.getPreferredSize().height));

Полный код будет:

public class DialogTest {
public static void main(String[] args) throws Exception {
    JTextPane jtp = new JTextPane();
    Document doc = jtp.getDocument();
    for (int i = 0; i < 50; i++) {
        doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
        if ((3 == i) || (7 == i) || (15 == i)) {
            doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
            SimpleAttributeSet attrs = new SimpleAttributeSet();
            StyleConstants.setUnderline(attrs, true);
            StyleConstants.setForeground(attrs, Color.BLUE);
            String text = "www.google.com";
            URL url = new URL("http://" + text);
            attrs.addAttribute(HTML.Attribute.HREF, url.toString());
            doc.insertString(doc.getLength(), text, attrs);
        }
    }
    //JScrollPane jsp = new JScrollPane(jtp);
    //jsp.setPreferredSize(new Dimension(480, 150));
    //jsp.setBorder(null);
    jtp.setSize(new Dimension(480, 10));
    jtp.setPreferredSize(new Dimension(480, jtp.getPreferredSize().height));

    //JOptionPane.showMessageDialog(null, jsp, "Title", JOptionPane.INFORMATION_MESSAGE);
    JOptionPane.showMessageDialog(null, jtp, "Title", JOptionPane.INFORMATION_MESSAGE);
}}
person Sharcoux    schedule 28.02.2014
comment
Спасибо, user1967800, это отлично работает для моего диалога. Я почти отказался от этого вопроса. но ты спас меня. - person swordartist; 28.02.2014

Чтобы изменить размер JOptionPane, используйте переопределенный класс, отображаемый в приведенном ниже URL-адресе: -

ModifiableJOptionPane

person Abhishek K    schedule 06.03.2018