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

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

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

Есть код:
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);
    }
}
По сути всё хорошо, но когда я запускаю программу, вместо нормальной кириллицы показываются прямоугольники с чёрным border ом и белым фоном. Я уверен, что дело в кодировке. Что делать?

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

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

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


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

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

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