Отображение кириллицы на swing - Java

Узнай цену своей работы

Формулировка задачи:

Есть код:
Листинг программы
  1. package com.company;
  2. import java.math.MathContext;
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import javax.swing.event.*;
  7. import java.math.*;
  8. public class Main extends JFrame {
  9. private static final int
  10. BYTE = 0,
  11. KBYTE = 1,
  12. MBYTE = 2,
  13. GBYTE = 3,
  14. TBYTE = 4,
  15. BIT = 5,
  16. KBIT = 6,
  17. MBIT = 7,
  18. GBIT = 8,
  19. TBIT = 9;
  20. private static final BigDecimal
  21. _K = new BigDecimal("1024"),
  22. _M = _K.multiply(_K),
  23. _G = _M.multiply(_K),
  24. _T = _G.multiply(_K),
  25. _1e3 = new BigDecimal("1e3"),
  26. _1e6 = new BigDecimal("1e6"),
  27. _1e9 = new BigDecimal("1e9"),
  28. _1e12 = new BigDecimal("1e12"),
  29. _8 = new BigDecimal("8");
  30. private static final MathContext RM = new MathContext(1, RoundingMode.HALF_EVEN);
  31. private JPanel main_panel;
  32. private JPanel source_panel;
  33. private JTextField source_field;
  34. private JComboBox source_unit_box;
  35. private DefaultComboBoxModel unit_model;
  36. private JTextPane result_pane;
  37. private Main()
  38. {
  39. main_panel = new JPanel();
  40. main_panel.setLayout(new BorderLayout());
  41. this.setContentPane(main_panel);
  42. source_panel = new JPanel();
  43. source_panel.setLayout(new FlowLayout(FlowLayout.LEFT));
  44. source_field = new JTextField();
  45. source_field.setPreferredSize(new Dimension(350, 25));
  46. source_field.getDocument().addDocumentListener(new DocumentListener()
  47. {
  48. public void insertUpdate(DocumentEvent e)
  49. {
  50. process();
  51. }
  52. public void removeUpdate(DocumentEvent e)
  53. {
  54. process();
  55. }
  56. public void changedUpdate(DocumentEvent e)
  57. {
  58. process();
  59. }
  60. });
  61. source_panel.add(source_field);
  62. source_unit_box = new JComboBox();
  63. source_unit_box.setPreferredSize(new Dimension(80, 25));
  64. source_unit_box = new JComboBox();
  65. source_unit_box.setEditable(false);
  66. unit_model = (DefaultComboBoxModel)source_unit_box.getModel();
  67. unit_model.addElement("байт");
  68. unit_model.addElement("килобайт");
  69. unit_model.addElement("мегабайт");
  70. unit_model.addElement("гигабайт");
  71. unit_model.addElement("терабайт");
  72. unit_model.addElement("бит");
  73. unit_model.addElement("килобит");
  74. unit_model.addElement("мегабит");
  75. unit_model.addElement("гигабит");
  76. unit_model.addElement("терабит");
  77. source_panel.add(source_unit_box);
  78. source_unit_box.addItemListener(new ItemListener()
  79. {
  80. public void itemStateChanged(ItemEvent e)
  81. {
  82. process();
  83. }
  84. });
  85. main_panel.add(source_panel, BorderLayout.NORTH);
  86. result_pane = new JTextPane();
  87. result_pane.setBorder(BorderFactory.createEtchedBorder());
  88. result_pane.setPreferredSize(new Dimension(430, 200));
  89. result_pane.setEditable(false);
  90. main_panel.add(result_pane, BorderLayout.CENTER);
  91. this.setTitle("Преобразование единиц объема информации");
  92. this.pack();
  93. }
  94. private void process()
  95. {
  96. String str = source_field.getText();
  97. str = str.replace(',', '.');
  98. BigDecimal source = null;
  99. try
  100. {
  101. source = new BigDecimal(str);
  102. }
  103. catch(NumberFormatException exc)
  104. {
  105. result_pane.setText("");
  106. return;
  107. }
  108. try
  109. {
  110. BigDecimal bits = null;
  111. String source_unit = null;
  112. int source_unit_index = source_unit_box.getSelectedIndex();
  113. switch(source_unit_index)
  114. {
  115. case BYTE: bits = source.multiply(_8); source_unit = "байт"; break;
  116. case KBYTE: bits = source.multiply(_8).multiply(_K); source_unit = "килобайт"; break;
  117. case MBYTE: bits = source.multiply(_8).multiply(_M); source_unit = "мегабайт"; break;
  118. case GBYTE: bits = source.multiply(_8).multiply(_G); source_unit = "гигабайт"; break;
  119. case TBYTE: bits = source.multiply(_8).multiply(_T); source_unit = "терабайт"; break;
  120. case BIT: bits = source; source_unit = "бит"; break;
  121. case KBIT: bits = source.multiply(_1e3); source_unit = "килобит"; break;
  122. case MBIT: bits = source.multiply(_1e6); source_unit = "мегабит"; break;
  123. case GBIT: bits = source.multiply(_1e9); source_unit = "гигабит"; break;
  124. case TBIT: bits = source.multiply(_1e12); source_unit = "терабит"; break;
  125. }
  126. if(bits==null)
  127. throw new Exception();
  128. StringBuffer sb = new StringBuffer(1000);
  129. String ls = "\r\n";
  130. sb.append(source.toString()+" "+source_unit+" это:"+ls);
  131. if(source_unit_index!=BYTE) sb.append(bits.divide(_8).toPlainString()+" байт"+ls);
  132. if(source_unit_index!=KBYTE) sb.append(bits.divide(_8).divide(_K).toPlainString()+" килобайт"+ls);
  133. if(source_unit_index!=MBYTE) sb.append(bits.divide(_8).divide(_M).toPlainString()+" мегабайт"+ls);
  134. if(source_unit_index!=GBYTE) sb.append(bits.divide(_8).divide(_G).toPlainString()+" гигабайт"+ls);
  135. if(source_unit_index!=TBYTE) sb.append(bits.divide(_8).divide(_T).toPlainString()+" терабайт"+ls);
  136. if(source_unit_index!=BIT) sb.append(bits.toPlainString()+" бит"+ls);
  137. if(source_unit_index!=KBIT) sb.append(bits.divide(_1e3).toPlainString()+" килобит"+ls);
  138. if(source_unit_index!=MBIT) sb.append(bits.divide(_1e6).toPlainString()+" мегабит"+ls);
  139. if(source_unit_index!=GBIT) sb.append(bits.divide(_1e9).toPlainString()+" гигабит"+ls);
  140. if(source_unit_index!=TBIT) sb.append(bits.divide(_1e12).toPlainString()+" терабит"+ls);
  141. String text = sb.toString().substring(0, sb.length()-ls.length());
  142. result_pane.setText(text);
  143. }
  144. catch (Exception exc)
  145. {
  146. result_pane.setText("Error! "+exc.getMessage());
  147. return;
  148. }
  149. }
  150. public static void main(String[] args)
  151. {
  152. Main f = new Main();
  153. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  154. f.setVisible(true);
  155. }
  156. }
По сути всё хорошо, но когда я запускаю программу, вместо нормальной кириллицы показываются прямоугольники с чёрным border ом и белым фоном. Я уверен, что дело в кодировке. Что делать?

Решение задачи: «Отображение кириллицы на swing»

textual
Листинг программы
  1. // Данные в кодировке КОИ-8
  2. byte[] koi8Data = ...;
  3. // Преобразуем из КОИ-8 в Unicode
  4. String string = new String(koi8Data,"KOI8_R");
  5. // Преобразуем из Unicode в Windows-1251
  6. byte[] winData = string.getBytes("Cp1251");

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут