Перенос текста в JOptionPane?

Я использую следующий код для отображения сообщения об ошибке в моем приложении Swing

try {
    ...
} catch (Exception exp) {
    JOptionPane.showMessageDialog(this, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}

Ширина диалогового окна с ошибками увеличивается в зависимости от сообщения. Есть ли способ обернуть сообщение об ошибке?

3 ответа

Решение

JOptionPane будет использовать JLabel отображать текст по умолчанию. Метка будет форматировать HTML. Установите максимальную ширину в CSS.

JOptionPane.showMessageDialog(
    this, 
    "<html><body><p style='width: 200px;'>"+exp.getMessage()+"</p></body></html>", 
    "Error", 
    JOptionPane.ERROR_MESSAGE);

В более общем плане см. Как использовать HTML в компонентах Swing, а также этот простой пример использования HTML вJLabel,

Добавьте свое сообщение в текстовый компонент, который можно обернуть, например JEditorPaneзатем укажите панель редактора в качестве message на ваш JOptionPane, См. Как использовать панели редактора и текстовые панели и Как создавать диалоги для примеров.

Приложение: В качестве альтернативы переносу, рассмотрим линейно-ориентированный подход в области прокрутки, как показано ниже.

изображение ошибки

f.add(new JButton(new AbstractAction("Oh noes!") {
    @Override
    public void actionPerformed(ActionEvent action) {
        try {
            throw new UnsupportedOperationException("Not supported yet.");
        } catch (Exception e) {
            StringBuilder sb = new StringBuilder("Error: ");
            sb.append(e.getMessage());
            sb.append("\n");
            for (StackTraceElement ste : e.getStackTrace()) {
                sb.append(ste.toString());
                sb.append("\n");
            }
            JTextArea jta = new JTextArea(sb.toString());
            JScrollPane jsp = new JScrollPane(jta){
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(480, 320);
                }
            };
            JOptionPane.showMessageDialog(
                null, jsp, "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}));

catch (Исключение e) {e.printStackTrace();

                      StringBuilder sb = new StringBuilder(e.toString());
                for (StackTraceElement ste : e.getStackTrace()) {
                    sb.append("\n\tat ");
                    sb.append(ste);
                }
                  
                JTextArea jta = new JTextArea(sb.toString());
                JScrollPane jsp = new JScrollPane(jta) {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(750, 320);
                    }
                };
                JOptionPane.showMessageDialog(
                        null, jsp, "Error", JOptionPane.ERROR_MESSAGE);
                break; /// to show just one time 
            }
Другие вопросы по тегам