Cześć
Mam pewne problemy z aplikacją którą piszę. Aplikacja ta wczytuje plik .txt i następnie generuje wykres kołowy. Chciałby właśnie w niej zmienić to żeby zamiast plików txt wczytywała xml za pomocą parsera SAX albo DOM. Czytałem w źródłach internetowych że biblioteka JFreeChart ma taką możliwość ale mi konkretnie chodzi o jeden z tych parserów. Wujek Google mało mi pomógł.
Kod:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package generator.wykresów;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.FontMapper;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RefineryUtilities;
/**
*
* @author DOM
*/
class JavaFilter extends javax.swing.filechooser.FileFilter
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith(".txt")||
f.isDirectory();
}
public String getDescription()
{
return "files (*.txt)";
}
}
class JavaFilter2 extends javax.swing.filechooser.FileFilter
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith(".jpg") ||
f.getName().toLowerCase().endsWith(".jpeg") ||
f.isDirectory();
}
public String getDescription()
{
return "files (*.jpg)";
}
}
class JavaFilter3 extends javax.swing.filechooser.FileFilter
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith(".pdf") ||
f.isDirectory();
}
public String getDescription()
{
return "files (*.pdf)";
}
}
class Ramka extends JFrame implements ActionListener
{
JPanel panelglowny = new JPanel();
JPanel panelCentralny = new JPanel();
JPanel panelLewy = new JPanel();
DefaultTableModel dtm;
JButton generuj,zapiszdoPDF,zapiszdoJPG;
JTable tabel;
JScrollPane scrollpane;
JLabel nazwaWykresu = new JLabel("Nazwa Wykresu");
HashMap hashmap;
JButton wczytajZPliku = new JButton("Wczytaj dane z pliku");
JTextField nazwaw;
JRadioButton kolowy, slupkowy, liniowy; //nowe
JavaFilter fJavaFilter = new JavaFilter();
JavaFilter2 fJavaFilter2 = new JavaFilter2();
JavaFilter3 fJavaFilter3 = new JavaFilter3();
File fFile = new File("domyslny.txt");
File fFile2 = new File("wykres.jpeg");
public JMenuBar menuBar;
JMenu plik = new JMenu("Plik");
JMenuItem zamknij = new JMenuItem("Zamknij");
JMenu zapisz = new JMenu("Zapisz wykres");
JMenuItem doPDF = new JMenuItem("jako PDF");
JMenuItem doJPG = new JMenuItem("jako obraz JPEG");
JButton pokaz, ukryj;
JTextArea textArea = new JTextArea("");
public Ramka()
{
setTitle("Tworzenie wykresów kołowych i słupkowych");
setSize(600,400);
hashmap = new HashMap();
menuBar = new JMenuBar();
panelglowny.setLayout(new BorderLayout());
panelLewy.setLayout(new GridLayout(2,1));
panelCentralny.setLayout(new GridLayout(1,1));
generuj = new JButton("Wyświetl wykres");
generuj.addActionListener(this);
dtm = new DefaultTableModel();
dtm.setColumnCount(3);
dtm.setRowCount(6);
tabel = new JTable(dtm);
nazwaw = new JTextField();
nazwaw.setPreferredSize(new Dimension(250,20));
nazwaw.addActionListener(this);
wczytajZPliku.addActionListener(this);
zapiszdoPDF = new JButton("Zapisz jako PDF");
zapiszdoPDF.addActionListener(this);
zapiszdoJPG = new JButton("Zapisz do obrazu JPEG");
zapiszdoJPG.addActionListener(this);
JPanel p1 = new JPanel();
p1.add(nazwaWykresu);
p1.add(nazwaw);
panelLewy.add(p1);
JLabel pomoc = new JLabel("Pomoc");
pokaz = new JButton("Pokaż pomoc");
pokaz.addActionListener(this);
ukryj = new JButton("Ukryj pomoc");
ukryj.addActionListener(this);
JPanel p2 = new JPanel();
p2.add(wczytajZPliku);
p2.add(zapiszdoPDF);
p2.add(zapiszdoJPG);
JPanel p3 = new JPanel();
p3.add(pomoc);
p3.add(pokaz);
p3.add(ukryj);
p3.add(textArea);
//p2.add(textArea);
panelLewy.add(p2);
panelLewy.add(p3);
panelCentralny.add(panelLewy);
panelglowny.add(panelCentralny, BorderLayout.CENTER);
panelglowny.add(generuj, BorderLayout.SOUTH);
add(panelglowny);
zamknij.addActionListener(this);
doPDF.addActionListener(this);
doJPG.addActionListener(this);
plik.add(zamknij);
zapisz.add(doPDF);
zapisz.add(doJPG);
menuBar.add(plik);
menuBar.add(zapisz);
setJMenuBar(menuBar);
//radioButton
JPanel p4 = new JPanel();
JRadioButton kolowy = new JRadioButton("Kołowy");
JRadioButton slubkowy = new JRadioButton("Słubkowy");
JRadioButton liniowy = new JRadioButton("Linowy");
JLabel typyWykresu = new JLabel("Typ Wykresu");
p4.add(typyWykresu);
p4.add(kolowy);
p4.add(slubkowy);
p4.add(liniowy);
ButtonGroup bg = new ButtonGroup();
bg.add(kolowy);
bg.add(slubkowy);
bg.add(liniowy);
boolean kolowy_selected = kolowy.isSelected();
boolean slubkowy_selected = slubkowy.isSelected();
boolean liniowy_selected = liniowy.isSelected();
kolowy.setSelected(true);
panelLewy.add(p4);
//koniec
}
/*
* @tworzenie wykresu kołowego
*/
public JFreeChart create3DChart(String title, HashMap hashmap)
{
DefaultPieDataset dataset = new DefaultPieDataset();
Set set = hashmap.entrySet();
Iterator i = set.iterator();
while(i.hasNext())
{
Map.Entry me = (Map.Entry)i.next();
dataset.setValue(me.getKey().toString(),Double.valueOf(me.getValue().toString()).doubleValue() );
}
//create a chart
JFreeChart chart = ChartFactory.createPieChart3D
(title,
dataset,
true, //legend
true, //tooltips
false);//URLs
return chart;
}
/*
* tworzenie wykresu z ramką i wyświetlanie go
*/
public Ramka(String title, HashMap hashmap)
{
super("Wykres");
JFreeChart chart = create3DChart(title, hashmap);
ChartPanel chartPanel = new ChartPanel(chart,false);
chartPanel.setPreferredSize(new Dimension(650,500));
setContentPane(chartPanel);
setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
}
/*
* Metody potrzebne do zapisywania do pliku pdf
* @zapisywanie do pliku PDF
*/
public static void saveChartAsPDF(File file,
JFreeChart chart,
int width,
int height,
FontMapper mapper) throws IOException
{
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
writeChartAsPDF(out, chart, width, height, mapper);
out.close();
}
public static void writeChartAsPDF(OutputStream out,
JFreeChart chart,
int width,
int height,
FontMapper mapper)throws IOException
{
Rectangle pagesize = new Rectangle(width, height);
Document document = new Document(pagesize, 50,50,50,50);
try
{
PdfWriter writer = PdfWriter.getInstance(document, out);
document.addAuthor("JFreeChart");
document.addSubject("Zapis do pdf");
document.open();
PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(width, height);
Graphics2D g2 = tp.createGraphics(width, height,mapper);
Rectangle2D r2D = new Rectangle2D.Double(0,0,width,height);
chart.draw(g2, r2D);
g2.dispose();
cb.addTemplate(tp, 0, 0);
}catch(DocumentException de){}
document.close();
}
/*
* koniec metod potrzebnych do zapisywania do pdf
*/
public void generujWykres()
{
for(int i=0; i<tabel.getRowCount(); i++)
{
if((tabel.getValueAt(i, 1) != null) && (tabel.getValueAt(i, 2) != null) )
{
try
{
hashmap.put(tabel.getValueAt(i, 1), (tabel.getValueAt(i, 2)));
}catch(Exception exc){System.out.println("exc");}
}
}
}
public void actionPerformed(ActionEvent e)
{
boolean status = false;
String command = e.getActionCommand();
if(command.equals("Wczytaj dane z pliku"))
{
status = otworzPlik();
if(!status)
{
JOptionPane.showMessageDialog(null, "Błąd przy otwieraniu",
"Błąd otwierania pliku",JOptionPane.ERROR_MESSAGE);
}
}
if(e.getSource() == generuj)
{
generujWykres();
Ramka barchart = new Ramka(nazwaw.getText(), hashmap);
barchart.pack();
RefineryUtilities.centerFrameOnScreen(barchart);
barchart.setVisible(true);
}
if(e.getSource() == zapiszdoPDF || (e.getSource() == doPDF))
{
zapiszPlik(2);
}
if(e.getSource() == zapiszdoJPG || (e.getSource() == doJPG))
{
zapiszPlik(1);
}
if(e.getSource() == zamknij)
{
System.exit(0);
}
if(e.getSource() == pokaz)
{
textArea.setText("Wczytywanie z pliku w formacie: \nKat1, 12.5 \nKat2, 34.6 \nKat3, 89 \nKat4, 12.6");
}
if(e.getSource() == ukryj)
{
textArea.setText("");
}
}
boolean zapiszPlik(int wybor)
{
File file = null;
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File("."));
//dodanie domyślnej nazwy do pliku do zapisania
if(wybor == 1)
{
fc.setSelectedFile(new File("wykres.jpeg"));
fc.setFileFilter(fJavaFilter2);
}
else if (wybor == 2)
{
fc.setSelectedFile(new File("wykres.pdf"));
fc.setFileFilter(fJavaFilter3);
}
//otwieranie okna
int result = fc.showSaveDialog(this);
if(result == JFileChooser.CANCEL_OPTION)
{
return true;
}
else if(result == JFileChooser.APPROVE_OPTION)
{
fFile = fc.getSelectedFile();
if(fFile.exists())
{
int potwierdzenie = JOptionPane.showConfirmDialog(null,
"Czy napewno nadpisać plik?","Potwierdzenie nadpisania",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(potwierdzenie == JOptionPane.CANCEL_OPTION) return false;
}
if(wybor == 1)
{
try
{
generujWykres();
JFreeChart chart = create3DChart(nazwaw.getText(), hashmap);
ChartUtilities.saveChartAsJPEG(fFile, chart, 800, 600);
} catch (Exception ex) {JOptionPane.showMessageDialog(null, "Problem z zapisaniem wykresu\n jako obraz jpeg");}
}
else if(wybor == 2)
{
try
{
generujWykres();
JFreeChart chart = create3DChart(nazwaw.getText(), hashmap);
saveChartAsPDF(fFile, chart, 400,300,new DefaultFontMapper());
}catch(IOException exc){}
}
return true;
}
else
{
return false;
}
}
boolean otworzPlik()
{
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("Otwórz plik");
//wybueranie tylko plikĂłw, nie katalogĂłw
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setCurrentDirectory(new File("."));
//dodanie filtrĂłw
fc.setFileFilter(fJavaFilter);
//okienko do otwierania
int result = fc.showOpenDialog(this);
if(result == JFileChooser.CANCEL_OPTION)
{
return true;
}
//wybranie pliku i wczytanie zawartości
else if(result == JFileChooser.APPROVE_OPTION)
{
fFile = fc.getSelectedFile();
czytajPlik(fFile);
}
else
{
return false;
}
return true;
}
public void czytajPlik(File file)
{
String line;
int i=0;
int ilewierszy = dtm.getRowCount();
int wiersz=0;
try
{
FileReader in = new FileReader(file);
BufferedReader br = new BufferedReader(in);
while((line = br.readLine()) !=null)
{
try
{
if (wiersz >= ilewierszy)
{
dtm.addRow(new Object[]{});
ilewierszy++;
}
String[] temp = line.split(",");
dtm.setValueAt(temp[0], i, 1);
dtm.setValueAt(temp[1], i, 2);
i++;
wiersz++;
}catch(Exception exc)
{
JOptionPane.showMessageDialog(null,"Błędny format danych w pliku!!");
dtm.setValueAt("", 0, 1);
break;
}
}
in.close();
}catch(IOException e){}
}
}
public class GeneratorWykresów {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Ramka r = new Ramka();
r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
r.setVisible(true);
}
}