Отображение кириллицы на 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");