2013-05-19 3 views
1

Мое приложение должно выводить содержимое для пользователя. Во всех моих классах я только что использовал System.out.println, но поскольку программа не предназначена для командной строки, это не подходит.Какова хорошая замена System.out.println?

Я думал о просто создании классов, которые расширяют JPanel и все содержимое добавляется в текстовое поле. Я читал, что это нехороший ход, и возникает проблема: мне придется передать класс JPanel всем классам, выводящим текст.

Есть ли эффективная альтернатива System.out.println? Если нет, как вы предлагаете мне продолжить? У меня есть предложения Java Logging, но я не хочу выводить в файл.

+3

Вы должны иметь ограниченное взаимодействие с пользователем в большинстве ваших классов и в самом деле кода пользовательского интерфейса должен быть отделен в своем собственном наборе класса. Вам следует попытаться написать код модели (не-UI), чтобы он мог хорошо работать в консольном приложении, приложении Swing, приложении SWT или другом приложении типа библиотеки UI. Таким образом, ваш код может работать с SOP или с графическим интерфейсом, как вы сочтете нужным. Я стану утверждать, что> 90% классов Java, созданных профессиональными кодировщиками, не содержат в них кода пользовательского интерфейса. –

+0

+ общий дизайн неправильный –

ответ

1

Что вам нужно, это настраиваемая структура ведения журнала, такая как Log4j. При написании пользовательского приложения для журналов вы должны выводить свой журнал в любом месте, а не только в файле: http://www.javaworld.com/javaworld/jw-12-2004/jw-1220-toolbox.html

3

У вас должно быть ограниченное взаимодействие с пользователем на большинстве ваших классов, и на самом деле код пользовательского интерфейса должен быть отдельным в свой собственный класс. Вам следует попытаться написать код модели (не-UI), чтобы он мог хорошо работать в консольном приложении, приложении Swing, приложении SWT или другом приложении типа библиотеки UI. Таким образом, ваш код может работать с SOP или с графическим интерфейсом, как вы сочтете нужным. Я стану утверждать, что> 90% классов Java, созданных профессиональными кодировщиками, не содержат в них кода пользовательского интерфейса.

Также обратите внимание, что код регистрации и взаимодействия с пользователем - это две полностью ортогональные концепции. Я смотрю на запись в качестве способа общения с разработчиком и сторонником, а не с пользователем.

2

Согласен с комментарием @ Hovercraft. Не проходите JPanel, используйте метод static в своем пользовательском интерфейсе, который вызывают все остальные объекты, когда они должны выводиться. Этот метод будет обрабатывать форматирование и добавление и все такое.

Кроме того, нет альтернативы println, когда дело доходит до Java. Это потому, что println выводит только на stdout и в GUI-приложении он скрыт, если пользователь не выполняет вашу программу из командной строки.

+0

Спасибо за совет. Я довольно noob, и я не думаю, что мои методы кодирования до нуля. Мой метод main() находится внутри моего пользовательского интерфейса. Все классы, которые используют System.out.println, создаются в классе UI. Поле ввода в стиле консоли, которое я пытаюсь использовать, - это JPanel с JTextArea, который также создается в классе UI. Если у меня есть статический метод в классе пользовательского интерфейса, который добавляет текст в консоль, я понимаю, что статический метод не будет доступен для остальных классов, что оставляет мне ту же проблему, что и передачу JPanel как параметр .. нет? – user2341412

+0

На самом деле, неважно, я нашел исправление. Я буду знать, чтобы сделать это по-другому в следующий раз. Спасибо за помощь. – user2341412

+0

Нет, метод, объявленный static, может быть вызван из любого места, где он виден, без необходимости создания экземпляра его класса (поэтому 'main' является статическим). Только «публичный» «закрытый» и связанные с ним ключевые слова влияют на видимость внутри пакета. Я понимаю, что у вас есть только один класс, это не очень хорошая идея, а не то, каким должна быть Java. Разбить его. Держите класс 'main' для инициализации, GUI-класса для пользовательского интерфейса и любых других классов для обработки. – rath

1

Причина в том, что отправка сообщений на стандартный вывод обычно не подходит в производственной среде. Если вы кодируете библиотеку, библиотека должна возвращать информацию своему вызывающему, а не печатать на stdout. Если вы кодируете приложение с графическим интерфейсом, информация должна быть представлена ​​пользователю, а не тому, где указывается то, что stdout указывает (что может быть нигде). Если вы кодируете сервер (или что-то, что выполняется в контейнере на стороне сервера), вы должны использовать любой механизм ведения журнала, предоставленный инфраструктурой. И так далее.

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

Также легко включить или отключить только некоторый тип сообщения при использовании регистратора - например, вы не хотите видеть каждое сообщение отладки в процессе производства.

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

Кстати, вы должны подумать о том, чтобы использовать что-то вроде Commons Logging или SLF4J как фасад фреймворка - это плохой стиль, чтобы связать ваш код с конкретной структурой ведения журнала. Common Logging и SLF4J позволяют легко переключаться на фреймворки регистрации, если вы решите.

1

Лучший способ вывода информации вашему пользователю зависит от типа приложения, над которым вы работаете.

Если ваше приложение является пакетно-ориентированным и очень техническим, может быть целесообразным отправить вывод в текстовую область с прокруткой (JTextArea), чтобы пользователи могли просматривать последний статус и прокручивать назад, чтобы получить детали, если они этого захотят.

Но если это более интерактивный и менее технический, вы должны попытаться минимизировать вывод только на самые важные вещи, такие как сообщения о статусе высокого уровня или критические сообщения об ошибках. Простые диалоги (JOptionPane) и строки состояния (JLabel) могут быть лучшими в этом случае.

В любом случае, если ваше приложение велико, вам следует подумать о его разработке, чтобы вы не разбросали много кода пользовательского интерфейса со всем остальным. Сохранение основной логики отдельно от кода презентации поможет в дальнейшем. Один общепринятый подход к этому называется модель-view-controller (MVC).

Вот пара хороших ссылок, чтобы вы начали с MVC.

-2

Есть хорошая практика-альтернатива System.out.println?

возвращение

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