2016-04-21 1 views
0

Я написал много проектов, используя JOptionPane, и почти каждый раз, когда меня расстраивает тот факт, что я не могу обернуть текст внутри них.JOptionPane с переносом текста с использованием пользовательского компонента Swing

Я знаю, что JOptionPane поддерживает HTML, но это всегда кажется недостаточным для выполнения того, что я хочу. Во-первых, JOptionPane не полностью поддерживает HTML - свойство max-width было бы замечательно иметь, например. С другой стороны, ни <br />, ни теги <p> не обеспечивают функциональность, на которой я на самом деле - JOptionPane, которая небольшая, когда сообщение мало, и может расти, когда сообщение больше, но которое не становится слишком большим, и, в конце концов, новая линия.

Это подводит меня к моему вопросу. Есть ли способ написать собственный пользовательский компонент, возможно, наследующий от JFrame или что-то подобное, что позволит мне смоделировать эффекты JOptionPane, но который обеспечивает более тонкое управление отображаемым текстом? Это должно включать, как минимум, функциональные возможности для управления максимальной шириной и обертыванием текста.

Я не нашел ответа на этот вопрос путем поиска других вопросов (возможно, ответ был заглушен всеми ответами, говорящими «используйте HTML»). Это не дубликат этих вопросов.

ответ

4

Exmaple

import java.awt.Component; 
import javax.swing.JOptionPane; 
import javax.swing.JTextArea; 

public class OptionPaneUtilities { 

    public static void main(String[] args) { 
     OptionPaneUtilities.showMessage(null, "I sometimes I think we forget just how flexible the JOptionPane API is and what it can do. A little effort could go a long way"); 
    } 

    public static void showMessage(Component comp, String message) { 
     JTextArea ta = new JTextArea(message, 1, 20); 
     ta.setWrapStyleWord(true); 
     ta.setLineWrap(true); 
     ta.setOpaque(false); 
     ta.setBorder(null); 
     ta.setEditable(false); 
     ta.setFocusable(false); 
     JOptionPane.showMessageDialog(comp, ta); 
    } 

} 

Теперь, очевидно, что это просто очень простой пример, вы собираетесь провести некоторое время, думая о том, как лучше применить эту концепцию на свой API, так это отвечает вашим потребностям и обеспечивает максимальную гибкость.

Вы могли бы использовать в JEditorPane вместо и получить как простой текст и HTML для работы с вне гораздо больше усилий

0

Вы говорите о чем-то, например, просто добавляете разрыв строки, поэтому в поле выбора не отображается эта длинная строка текста? Если это так:

JOptionPane.showMessageDialog(null, "This "\nmessage "\nhas "\nlinebreaks.")

должно хватить. Использование \ n (текст) создает разрыв строки. Надеюсь, это поможет, хорошо провести ночь. :)

+0

Спасибо за ответ, но это не решает мою проблему. Я хочу, чтобы компонент был многоразовым и надежным, и в целом может обрабатывать любые типы ввода, которые я передаю ему. Я хочу иметь возможность передать его «Привет» или весь абзац, и он все равно будет отображаться чисто. Я НЕ хочу форматировать каждый текст, который я передаю ему вручную, вставляя кучу разрывов строк. На самом деле, все дело в том, чтобы не делать что-то подобное. Там должен быть компонент, который делает это для нас. – nhouser9

+0

@ nhouser9 Если бы у меня был доллар за каждый раз, когда я слышал, что кто-то сказал это. Swing API очень гибкий, вы были бы удивлены тем, что может принести немного усилий. Например, знаете ли вы, что параметр 'message' для' JOptionPane' является 'Object', и если вы передаете ему объект на основе компонента, он просто« добавлен »в' JOptionPane'. Подумайте об этом на несколько мгновений – MadProgrammer

Смежные вопросы