Отображение кириллицы на 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");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д