Переписать отсортированный массив в JTextPane в Java
Я работал над этим проектом около недели. Он использует компаратор для сортировки строк фильмов по названию, дате или компании. Проблема, с которой я столкнулся сейчас, заключается в том, как вернуть отсортированный массив обратно в JTextPane.
Я пробовал setText(), repaint() и print(), каждый из которых выдает некоторую ошибку, такую как: String[][] не может быть преобразован в String или String [] [] не может быть преобразован в long. если я запускаю программу и выбираю один из видов (sortByDate, sortByTitle и т. д.), программа выводит пакетный файл Windows в файл, в котором хранятся коды. Я могу открыть эти пакетные файлы и увидеть отсортированные массивы, но я не могу заставить их отображать их обратно в JTextPane.
Любая помощь в выяснении, как это исправить, будет принята с благодарностью.
Вот мой код:
import java.util.Arrays;
import java.util.Comparator;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
class MenuExample extends Frame implements ActionListener
{
MenuBar mbar;
Menu menu, submenu;
MenuItem m1, m2, m3, m4, m5;
String[][] data = new String[][]
{
new String[] { "Casablanca", "Warner Brothers", "1942" },
new String[] { "Citizen Kane", "RKO Pictures", "1941" },
new String[] { "Singin' in the Rain", "MGM", "1952" },
new String[] { "the Wizard of Oz", "MGM", "1930" }
};
public MenuExample()
{
setTitle("AWT Menu");
setSize(800, 500);
setLayout(new FlowLayout());
setVisible(true);
setLocationRelativeTo(null);
mbar = new MenuBar();
menu = new Menu("Menu");
submenu = new Menu("Sub Menu");
m1 = new MenuItem("Sort by Title");
m1.setActionCommand("Title");
m1.addActionListener(this);
m2 = new MenuItem("Sort by Date");
m2.setActionCommand("Date");
m2.addActionListener(this);
m3 = new MenuItem("Sort by Company");
m3.setActionCommand("Company");
m3.addActionListener(this);
m4 = new MenuItem("Menu Item 4");
m5 = new MenuItem("Menu Item 5");
menu.add(m1);
menu.add(m2);
menu.add(m3);
submenu.add(m4);
submenu.add(m5);
menu.add(submenu);
mbar.add(menu);
setMenuBar(mbar);
JPanel textPanel = new JPanel();
JTextPane textArea = new JTextPane();
Dimension textAreaDimensions = new Dimension(500, 300);
textArea.setPreferredSize(textAreaDimensions);
JScrollPane scroll = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
Document doc = textArea.getDocument();
try
{
for(int i = 0; i < 4; i ++)
{
for(int j = 0; j < 3; j ++)
doc.insertString(doc.getLength(), data[i][j] + "\t", textArea.getStyle("bold"));
doc.insertString(doc.getLength(), "\n", textArea.getStyle("bold"));
}
}
catch (Exception e) {}
textPanel.add(scroll);
add(textPanel);
validate();
repaint();
}
public void actionPerformed(ActionEvent e)
{
String arg = e.getActionCommand();
if(arg.equals("Title"))
{
Arrays.sort(data, new sortByTitle());
}
if(arg.equals("Date"))
{
Arrays.sort(data, new sortByDate());
}
if(arg.equals("Company"))
{
Arrays.sort(data, new sortByCompany());
}
}
public static void main(String args[])
{
new MenuExample();
}
}
Методы sortByTitle, sortByDate и sortByCompany являются внешними методами и пишутся так:
import java.util.Arrays;
import java.util.Comparator;
public class sortByTitle implements Comparator<String[]>
{
public int compare(final String[] entry1, final String[] entry2)
{
final String field1 = entry1[0];
final String field2 = entry2[0];
return field1.compareTo(field2);
}
}
1 ответ
- Не используйте 3-строковый массив, к которому относится полноценный класс. Это опасный и хрупкий клудж.
- Не смешивайте AWT (Frame) с компонентами Swing (все остальное). Используйте все компоненты Swing.
- Отображение ваших табличных данных в компоненте, который был специально создан для отображения табличных данных и который легко сортировать: JTable, а не JTextPane.