Отображение кириллицы на swing - Java
Формулировка задачи:
Есть код:
По сути всё хорошо, но когда я запускаю программу, вместо нормальной кириллицы показываются прямоугольники с чёрным border ом и белым фоном. Я уверен, что дело в кодировке. Что делать?
package com.company; import java.math.MathContext; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.math.*; public class Main extends JFrame { private static final int BYTE = 0, KBYTE = 1, MBYTE = 2, GBYTE = 3, TBYTE = 4, BIT = 5, KBIT = 6, MBIT = 7, GBIT = 8, TBIT = 9; private static final BigDecimal _K = new BigDecimal("1024"), _M = _K.multiply(_K), _G = _M.multiply(_K), _T = _G.multiply(_K), _1e3 = new BigDecimal("1e3"), _1e6 = new BigDecimal("1e6"), _1e9 = new BigDecimal("1e9"), _1e12 = new BigDecimal("1e12"), _8 = new BigDecimal("8"); private static final MathContext RM = new MathContext(1, RoundingMode.HALF_EVEN); private JPanel main_panel; private JPanel source_panel; private JTextField source_field; private JComboBox source_unit_box; private DefaultComboBoxModel unit_model; private JTextPane result_pane; private Main() { main_panel = new JPanel(); main_panel.setLayout(new BorderLayout()); this.setContentPane(main_panel); source_panel = new JPanel(); source_panel.setLayout(new FlowLayout(FlowLayout.LEFT)); source_field = new JTextField(); source_field.setPreferredSize(new Dimension(350, 25)); source_field.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent e) { process(); } public void removeUpdate(DocumentEvent e) { process(); } public void changedUpdate(DocumentEvent e) { process(); } }); source_panel.add(source_field); source_unit_box = new JComboBox(); source_unit_box.setPreferredSize(new Dimension(80, 25)); source_unit_box = new JComboBox(); source_unit_box.setEditable(false); unit_model = (DefaultComboBoxModel)source_unit_box.getModel(); unit_model.addElement("байт"); unit_model.addElement("килобайт"); unit_model.addElement("мегабайт"); unit_model.addElement("гигабайт"); unit_model.addElement("терабайт"); unit_model.addElement("бит"); unit_model.addElement("килобит"); unit_model.addElement("мегабит"); unit_model.addElement("гигабит"); unit_model.addElement("терабит"); source_panel.add(source_unit_box); source_unit_box.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { process(); } }); main_panel.add(source_panel, BorderLayout.NORTH); result_pane = new JTextPane(); result_pane.setBorder(BorderFactory.createEtchedBorder()); result_pane.setPreferredSize(new Dimension(430, 200)); result_pane.setEditable(false); main_panel.add(result_pane, BorderLayout.CENTER); this.setTitle("Преобразование единиц объема информации"); this.pack(); } private void process() { String str = source_field.getText(); str = str.replace(',', '.'); BigDecimal source = null; try { source = new BigDecimal(str); } catch(NumberFormatException exc) { result_pane.setText(""); return; } try { BigDecimal bits = null; String source_unit = null; int source_unit_index = source_unit_box.getSelectedIndex(); switch(source_unit_index) { case BYTE: bits = source.multiply(_8); source_unit = "байт"; break; case KBYTE: bits = source.multiply(_8).multiply(_K); source_unit = "килобайт"; break; case MBYTE: bits = source.multiply(_8).multiply(_M); source_unit = "мегабайт"; break; case GBYTE: bits = source.multiply(_8).multiply(_G); source_unit = "гигабайт"; break; case TBYTE: bits = source.multiply(_8).multiply(_T); source_unit = "терабайт"; break; case BIT: bits = source; source_unit = "бит"; break; case KBIT: bits = source.multiply(_1e3); source_unit = "килобит"; break; case MBIT: bits = source.multiply(_1e6); source_unit = "мегабит"; break; case GBIT: bits = source.multiply(_1e9); source_unit = "гигабит"; break; case TBIT: bits = source.multiply(_1e12); source_unit = "терабит"; break; } if(bits==null) throw new Exception(); StringBuffer sb = new StringBuffer(1000); String ls = "\r\n"; sb.append(source.toString()+" "+source_unit+" это:"+ls); if(source_unit_index!=BYTE) sb.append(bits.divide(_8).toPlainString()+" байт"+ls); if(source_unit_index!=KBYTE) sb.append(bits.divide(_8).divide(_K).toPlainString()+" килобайт"+ls); if(source_unit_index!=MBYTE) sb.append(bits.divide(_8).divide(_M).toPlainString()+" мегабайт"+ls); if(source_unit_index!=GBYTE) sb.append(bits.divide(_8).divide(_G).toPlainString()+" гигабайт"+ls); if(source_unit_index!=TBYTE) sb.append(bits.divide(_8).divide(_T).toPlainString()+" терабайт"+ls); if(source_unit_index!=BIT) sb.append(bits.toPlainString()+" бит"+ls); if(source_unit_index!=KBIT) sb.append(bits.divide(_1e3).toPlainString()+" килобит"+ls); if(source_unit_index!=MBIT) sb.append(bits.divide(_1e6).toPlainString()+" мегабит"+ls); if(source_unit_index!=GBIT) sb.append(bits.divide(_1e9).toPlainString()+" гигабит"+ls); if(source_unit_index!=TBIT) sb.append(bits.divide(_1e12).toPlainString()+" терабит"+ls); String text = sb.toString().substring(0, sb.length()-ls.length()); result_pane.setText(text); } catch (Exception exc) { result_pane.setText("Error! "+exc.getMessage()); return; } } public static void main(String[] args) { Main f = new Main(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
Решение задачи: «Отображение кириллицы на swing»
textual
Листинг программы
// Данные в кодировке КОИ-8 byte[] koi8Data = ...; // Преобразуем из КОИ-8 в Unicode String string = new String(koi8Data,"KOI8_R"); // Преобразуем из Unicode в Windows-1251 byte[] winData = string.getBytes("Cp1251");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д