Есть много особенностей, про которые желательно знать, программируя на Java, даже если Вы начинающий программист. Под катом я расскажу как вывести кириллические символы в консоль Windows и наглядно это продемонстрирую.
Начнем с простого.
Базовые типы
Их в Java 8:
Char
- это символьный тип данных. Переменная такого типа занимает 2 байта памяти, так как хранится в кодировке unicode.
С переменными этого типа можно производить только операции присваивания, но зато различными способами. Самый простой из них выглядит так:
c = "b";
Символ можно представить также в виде его кода, записанного в восьмеричной системе счисления:
c = "\077";
Где 077 – это обязательно трехзначное число, не большее чем 377 (=255 в десятичной системе счисления).
Или же в шестнадцатеричной системе счисления следующим образом:
c = "\u12a4";
Кроме того, существуют специальные символы, такие как знак абзаца, разрыв страницы и др. Знак абзаца запишется, например, так:
c = "\n";
Не нужно перечислять их здесь. При необходимости всегда можно заглянуть в справочник.
Теперь внимание. Кодировкой по-умолчанию среды программирования Java является Latin-1. Однако, при выводе в поток System.out символы преобразуются в кодировку по умолчанию для операционной системы. Так для русскоязычной локализации кодировкой по-умолчанию является Windows-1251, для linux таковой будет UTF-8. Однако по задумке Microsoft решили для консоли Windows использовать кодировку Cp866.
Соответственно вывод: для корректного отображения кириллических символов в консоли нужно выводить символы в кодировке Cp866!
Это можно сделать следующим способом:
Import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
Public class Hello {
public static void main(String args) throws UnsupportedEncodingException { /*Может возникнуть исключение типа UnsupportedEncodingException*/
String x = "Привет, мир!!!"; //Это строка, которую мы будем выводить на экран
PrintStream printStream = new PrintStream(System.out, true, "cp866");
/*Создаем новый поток вывода, который будет автоматически преобразоввывать символы в кодировку Cp866*/
printStream.println(x);
}
}
Сохраним полученный код в файл Hello.java. Далее создадим Hello.bat файл следующего содержания:
javac Hello.java
java -cp . Hello
pause
И поместим его в одну папку с файлом Hello.java. Должно получиться примерно так:
Далее запускаем полученный Hello.bat файл и вуаля, у нас образовался файл Hello.class в той же директории а на экран вывелось сообщение «Привет, мир!!!» в кодировке Cp866.
Для того, чтобы узнать, какая кодировка в данный момент используется в консоли нужно набрать там «chcp». А для того, чтобы поменять кодировку консоли, нужно набрать «chcp <номер кодовой таблицы>» например «chcp 1251». Продемонстрирую использование этой команды:
Замечание: если у Вас не находит команду javac, то заходим (для Windows 7) «Мой компьютер» - «Свойства» - «Дополнительные параметры системы» - «Переменные среды», находим «Системные переменные» и в переменную Path добавляем строку, куда установлена JDK, например «C:\Program Files\Java\jdk1.7.0_25\bin» - по умолчанию.
Библиотека Swing включает богатый выбор стандартных диалоговых окон, существенно упрощающих и ускоряющих вывод простой информации типа сообщений о работе программы, ошибках и нестандартных ситуациях. Для вывода в графический интерфейс приложения разнообразной информации и выбора простых данных предназначен класс JOptionPane , работа с которым связана с вызовом одного из многочисленных статических методов, создающих и выводящих на экран модальное диалоговое окно стандартного вида. В диалоговых окнах JOptionPane можно выводить самую разнообразную информацию и, при необходимости, размещать в них дополнительные компоненты.
JOptionPane унаследован от базового класса JComponent библиотеки Swing, так что можно работать с ним напрямую, т.е. создавать экземпляры класса JOptionPane и настраивать их свойства. Использование стандартных диалоговых окон существенно упрощает разработку приложения и позволяет ускорить процесс освоения пользователем интерфейса.
Все стандартные диалоговые окна Swing имеют собственные UI-представители, отвечающие за интерфейс окна в используемом приложении. Это особенно важно для внешних видов окон, имитирующих известные платформы, пользователи которых не должны ощущать значительной разницы при переходе от «родных» приложений к Java-приложениям.
Интерфейс экземпляра класса JOptionPane имеет структуру, представленную на следующем рисунке. Иконка в интерфейсе может отсутствовать.
// Простое диалоговое окно с заголовком «Message» public static void showMessageDialog(Component parent, Object message) throws HeadlessException // Диалоговое окно с заголовком и типом сообщения public static void showMessageDialog(Component parent, Object message, String title, int messageType) throws HeadlessException // Диалоговое окно с заголовком, типом сообщения и иконкой public static void showMessageDialog(Component parent, Object message, String title, int messageType, Icon icon) throws HeadlessException
// Простое диалоговое окно подтверждения с кнопками Yes, No, Cancel и // с заголовком «Select an Option» public static void showConfirmDialog(Component parent, Object message) throws HeadlessException // Окно подтверждения с заголовком и кнопками, определенными // опцией optionType public static void showConfirmDialog(Component parent, Object message, String title, int optionType) throws HeadlessException // Окно подтверждения с заголовком, кнопками, определенными // опцией optionType, и иконкой public static void showConfirmDialog(Component parent, Object message, String title, int optionType, Icon icon) throws HeadlessException
// Диалоговое окно с полем ввода public static void showInputDialog(Component parent, Object message) throws HeadlessException // Диалоговое окно с полем ввода, инициализируемое initialSelectionValue public static void showInputDialog(Component parent, Object message, Object initialSelectionValue) throws HeadlessException // Диалоговое окно с полем выбора из списка selectionValues public static void showInputDialog(Component parent, Object message, String title, int messageType, Icon icon, Object selectionValues, Object initialSelectionValue) throws HeadlessException
parent - родительское окно.
message - отображаемый в окне текст сообщения. В большинстве случаев это строка, но может быть использован массив строк String, компонент Component, иконка Icon, представленная меткой JLabel, объект Object, конвертируемый в строку методом toString().
title - заголовок окна.
messageType - тип диалогового окна:
optionType - опция определения кнопок управления:
selectionValues - список возможных значений. В диалоговом окне InputDialog список будет представлен в компоненте JComboBox или JList. Если selectionValues = null, то в окне будет определено поле JTextField, в которое пользователь может ввести любое значение.
initialSelectionValue - инициализируемое значение.
icon - отображаемая в диалоговом окне иконка.
Кнопки управления, как правило, имеют заголовки «Yes», «No», «Cancel». Для локализации кнопок диалогового компонента JOptionPane можно использовать UIManager следующим образом:
UIManager.put("OptionPane.yesButtonText" , "Да"); UIManager.put("OptionPane.noButtonText" , "Нет"); UIManager.put("OptionPane.cancelButtonText", "Отмена"); UIManager.put("OptionPane.okButtonText" , "Готово");
Пример JOptionPaneTest.java включает использование всех типов диалоговых окон JOptionPane . В интерфейсе окна, представленном на следующем скриншоте, размещаются кнопки, по нажатию на которые формируются соответствующие диалоговые окна JOptionPane .
// Пример использования диалоговых окон JOptionPane import javax.swing.*; import java.awt.event.*; public class JOptionPaneTest extends JFrame { private JPanel contents = null; private JButton btnMessage1 = null; private JButton btnMessage2 = null; private JButton btnMessage3 = null; private JButton btnConfirm1 = null; private JButton btnConfirm2 = null; private JButton btnConfirm3 = null; private JButton btnInput1 = null; private JButton btnInput2 = null; private JButton btnInput3 = null; private ImageIcon icon = null; private final String TITLE_message = "Окно сообщения"; private final String TITLE_confirm = "Окно подтверждения"; private String drink = {"Сок", "Минералка", "Лимонад" , "Пиво"}; public JOptionPaneTest() { super("Пример использования JOptionPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // Локализация кнопок UIManager.put("OptionPane.yesButtonText" , "Да"); UIManager.put("OptionPane.noButtonText" , "Нет"); UIManager.put("OptionPane.cancelButtonText", "Отмена"); contents = new JPanel(); // Иконка для отображения в окне сообщений icon = new ImageIcon("images/warning.png"); // Кнопка формирования окна по 2-м параметрам btnMessage1 = new JButton("MessageDialog 2"); // Кнопка формирования окна по 4-м параметрам btnMessage2 = new JButton("MessageDialog 4"); // Кнопка формирования окна по 5-и параметрам btnMessage3 = new JButton("MessageDialog 5"); // Кнопки вывода сообщений подтверждения btnConfirm1 = new JButton("ConfirmDialog 4+2"); btnConfirm2 = new JButton("ConfirmDialog 5"); btnConfirm3 = new JButton("ConfirmDialog 6"); btnInput1 = new JButton("InputDialog 2+3"); btnInput2 = new JButton("InputDialog 4"); btnInput3 = new JButton("InputDialog 7"); addMessageListeners(); addConfirmListeners(); addInputListeners (); // Размещение кнопок в интерфейсе contents.add(btnMessage1); contents.add(btnMessage2); contents.add(btnMessage3); contents.add(btnConfirm1); contents.add(btnConfirm2); contents.add(btnConfirm3); contents.add(btnInput1); contents.add(btnInput2); contents.add(btnInput3); setContentPane(contents); // Вывод окна на экран setSize(500, 140); setVisible(true); } }
В методах addMessageListeners() , addConfirmListeners() , addInputListeners() определяются слушатели, обрабатывающие нажатие соответствующих кнопок.
Листинг процедуры создания слушателей, формирующие диалоговые окна вывода сообщений.
Private void addMessageListeners() { btnMessage1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(JOptionPaneTest.this, "
1. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage1 . Конструктор получает 2 параметра: родитель и текст сообщения. В заголовок подставляется значение «Message». Текст сообщения имеет HTML разметку.
2. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage2 . Конструктор получает 4 параметра: родитель, текст сообщения в виде массива строк, строку заголовка окна и тип сообщения.
3. Интерфейс окна вывода сообщений по нажатию на кнопку btnMessage2 . Конструктор получает 5 параметров: родитель, текст сообщения, строку заголовка окна, тип сообщения и иконку.
Листинг процедуры создания слушателей, формирующие диалоговые окна подтверждений.
Private void addConfirmListeners() { btnConfirm1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Окно подтверждения c 4-мя параметрами int result = JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вам это нужно?", TITLE_confirm, JOptionPane.YES_NO_CANCEL_OPTION); // Окна подтверждения c 2-мя параметрами if (result == JOptionPane.YES_OPTION) JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы не отказываетесь?"); else if (result == JOptionPane.NO_OPTION) JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы отказались?"); } }); btnConfirm2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вы не отказываетесь?", TITLE_confirm, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); }}); btnConfirm3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showConfirmDialog(JOptionPaneTest.this, "Вам нравится значок?", TITLE_confirm, JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, icon); }}); }
1. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm1 . Конструктор получает 4 параметра: родитель, текст сообщения, строка заголовка и опция кнопок управления
В зависимости от нажатой кнопки открываются следующее окно подтверждение (одно из окон на следующем скриншот), конструктор которого получает 2 параметра. Текст заголовка имеет значение по умолчанию «Select an Option».
2. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm2 . Конструктор получает 5 параметров: родитель, текст сообщения, строка заголовка, опция кнопок управления и тип сообщения.
3. Интерфейс окна подтверждения по нажатию на кнопку btnConfirm3 . Конструктор получает 6 параметров: родитель, текст сообщения, строка заголовка, опция кнопок управления, тип сообщения и иконка.
Листинг процедуры создания слушателей, формирующие диалоговые окна выбора
Private void addInputListeners() { btnInput1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Диалоговое окно ввода данных: родитель, HTML сообщение String result = JOptionPane.showInputDialog(JOptionPaneTest.this, "
1. Интерфейс окна ввода данных по нажатию на кнопку btnInput1 представлен на скриншоте слева. Конструктор получает 2 параметра: родитель и текст сообщения с разметкой HTML. После ввода значения и нажатия на одну из клавиш открывается окно, представленное на скриншоте справа.
2. На следующем скриншоте представлен интерфейс окна ввода данных, создаваемое конструктором, которому в качестве текста передается родитель, текстовое сообщение в виде массива строк, строка заголовка и тип диалогового окна (иконки).
3. Интерфейс окна ввода данных по нажатию на кнопку btnInput3 представлен на следующем скриншоте слева. Конструктор получает все возможные параметры: родитель, текстовое сообщение, строка заголовка, тип диалогового окна, иконка, массив строк и выделенное значение по умолчанию. В диалоговом окне возможные значения представлены в компоненте выпадающего списка. После выбора значения и нажатия на одну из клавиш открывается окно вывода сообщения, представленное на скриншоте справа.
Исходные коды примеров, рассмотренных на странице, можно (2.25 Кб).
В этом уроке мы поговорим о формате вывода чисел в Java. Научимся выводить числа с заданной точностью.