2016-04-20 23 views
-2

Ich habe ein Java-GUI-Programm geschrieben, das eine Textdatei öffnet und die Daten im linken Bereich liest. Jetzt möchte ich ein Diagramm der Daten anzeigen, die aus der gleichen Datei im rechten Feld gelesen werden.Wie zeichne ich einen Liniendiagramm in Java mit Dataset aus einer Textdatei?

Ich habe JFileChooser verwendet, um Dateien zu öffnen und die Daten zu lesen und sie in einem Textbereich anzuzeigen. Ich möchte, dass die aus der Datei gelesenen Daten unter Verwendung eines zweidimensionalen X-Y-Graphen angezeigt werden. Die Achse des Diagramms sollte mit den in der Datendatei angegebenen Kennzeichnungsinformationen gekennzeichnet werden. Die Werte auf der X-Achse sollten mit dem angegebenen Startwert für die X-Achse beginnen, mit Intervallen, die mit einer Geschwindigkeit zunehmen, die durch den Wert des X-Achsen-Intervalls bestimmt wird. Die Werte auf der Y-Achse müssen aus den Daten selbst bestimmt werden. Jeder im Diagramm aufgetragene Punkt sollte mit einer einzelnen Linie verbunden werden.

Ich habe mehrere Methoden verwendet, aber keine funktionierte. Ich habe versucht, jede Zeile in der Textdatei als Arrays zu lesen und die Arrays als Dataset zu verwenden, aber es hat nicht so gut funktioniert. Bitte hilf mir, ein Diagramm aus den Daten der Textdatei zu zeichnen. Jede Hilfe wäre willkommen. Vielen Dank.

P.S Die Grafik sollte nur mit AWT/Swing-Bibliotheken gezeichnet werden.

Die Daten der Datei lautet wie folgt:

Title: Effect of Age on Ability 
Xlabel: Age 
Ylabel: Ability 
start: 0 
interval: 15 
0, 3, 4.2, 7, 5.1, 10, 3.2 

meinen Code Im Folgenden sind die ich bisher geschrieben haben:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.List; 
import java.awt.TextArea; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Scanner; 

import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 
import javax.swing.event.MenuEvent; 
import javax.swing.event.MenuListener; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.general.DefaultPieDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

@SuppressWarnings("serial") 
public class GUI extends JFrame { 

    private String[] readLines = new String[6]; 

    public GUI() { 
     // Setting Title, size and layout 
     setTitle("Data Visualiser"); 
     setSize(950, 1000); 
     setLayout(new BorderLayout()); 

     // Creates a menubar for a JFrame 
     final JMenuBar menuBar = new JMenuBar(); 

     // Add the menubar to the frame 
     setJMenuBar(menuBar); 

     // Define and add two drop down menu to the menubar, "file" and "help" 
     JMenu fileMenu = new JMenu("File"); 
     JMenu helpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(helpMenu); 

     // adding menu items and icons to the "file" drop down menu, 
     final JMenuItem openAction = new JMenuItem("Open", new ImageIcon("images/Open-icon.png")); 

     final JMenuItem saveAction = new JMenuItem("Save", new ImageIcon("images/save-file.png")); 

     final JMenuItem exitAction = new JMenuItem("Exit", new ImageIcon("images/exit-icon.png")); 

     final JMenuItem aboutAction = new JMenuItem("About", new ImageIcon("images/about-us.png")); 

     ////////////////////////////////////////////////////////////////////////////////////////////// 
     // Create a text area. 
     final JTextArea textArea = new JTextArea(""); 
     textArea.setFont(new Font("Serif", Font.BOLD, 16)); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     textArea.setEditable(false); 
     JScrollPane textScrollPane = new JScrollPane(textArea); 
     // textArea.add(textScrollPane, BorderLayout.CENTER); //add the 
     // JScrollPane to the panel 

     // Scrollbars 
     textScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     textScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     textScrollPane.setPreferredSize(new Dimension(350, 550)); 
     textScrollPane.setBorder(
      BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Textual Representation"), 
       BorderFactory.createEmptyBorder(5, 5, 5, 5))); 

     // Create an graphics pane. 
     JPanel graphicsArea = new JPanel(); 
     //graphicsArea.setFont(new Font("Serif", Font.BOLD, 16)); 
     JScrollPane graphicsScrollPane = new JScrollPane(graphicsArea); 

     // Scrollbars 
     graphicsScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     graphicsScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     graphicsScrollPane.setPreferredSize(new Dimension(550, 550)); 
     graphicsScrollPane.setBorder(
      BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Graphical Representation"), 
       BorderFactory.createEmptyBorder(5, 5, 5, 5))); 

     // Put the graphics pane and the text pane in a split pane. 
     JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, textScrollPane, graphicsScrollPane); 
     splitPane.setOneTouchExpandable(true); 
     splitPane.setResizeWeight(0.5); 

     JPanel rightPane = new JPanel(new GridLayout(1, 0)); 
     rightPane.add(splitPane); 

     // Put everything together. 
     JPanel leftPane = new JPanel(new BorderLayout()); 
     add(rightPane, BorderLayout.LINE_END); 

     //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     // file menu shortcut 
     fileMenu.setMnemonic(KeyEvent.VK_F); 

     fileMenu.add(openAction); 
     // openAction.addActionListener(this); 
     openAction.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       if (arg0.getSource().equals(openAction)) { 

        // using JFileChooser to open the text file 
        JFileChooser fileChooser = new JFileChooser(); 

        if (fileChooser.showOpenDialog(fileChooser) == JFileChooser.APPROVE_OPTION) { 
         // fileChooser.setCurrentDirectory(new 
         // File(System.getProperty("user.home"))); // setting 
         // current 
         // directory 
         File file = fileChooser.getSelectedFile(); 
         BufferedReader br = null; 

         try { 
          // FileReader fr = new FileReader(file); 
          Scanner f = new Scanner(file); 
          for (int i = 0; i < 6; i++) { 
           readLines[i] = f.nextLine(); 
           textArea.setText(textArea.getText() + readLines[i] + "\n"); 
           String array[] = readLines[i].split(" "); 

          } 
         } catch (FileNotFoundException e) { 
          JOptionPane.showMessageDialog(new JFrame(), "File not found!", "ERROR!", 
           JOptionPane.ERROR_MESSAGE); // error message 
          // if file not 
          // found 
         } catch (NullPointerException e) { 
          // System.out.println(e.getLocalizedMessage()); 
         } finally { 
          if (br != null) { 
           try { 
            br.close(); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
         } 

        } 
       } 
      } 
     }); 

     fileMenu.add(saveAction); 
     fileMenu.add(exitAction); 

     // exit button shortcut 
     exitAction.setMnemonic(KeyEvent.VK_X); 
     exitAction.addActionListener(new ActionListener() { 

      // setting up exit button 
      public void actionPerformed(ActionEvent arg0) { 
       if (arg0.getSource().equals(exitAction)) { 
        System.exit(0); 
       } 
      } 
     }); 

     fileMenu.addSeparator(); 

     helpMenu.addSeparator(); 
     helpMenu.add(aboutAction); 

     // about button shortcut 
     aboutAction.setMnemonic(KeyEvent.VK_A); 
     aboutAction.addActionListener(new ActionListener() { 

      // clicking on about button opens up a dialog box which contain 
      // information about the program 
      public void actionPerformed(ActionEvent arg0) { 
       JOptionPane.showMessageDialog(menuBar.getComponent(0), 
        "This program is based on the development of a data visualization tool. \n" 
        + "The basic concept is to produce a piece of software which reads in raw textual data, \n" 
        + "analyses that data, then presents it graphically to the user.", 
        "About Us", JOptionPane.PLAIN_MESSAGE); 
      } 
     }); 

    } 
} 
+0

Sie werden Sie konfrontiert und stellen ein vollständiges, minimales Beispiel über das eigentliche Problem spezifisch sein müssen, die uns das Problem verstehen hilft. Nicht viele Leute werden bereit sein, Ihren Code-Dump, eine vage Problemaussage zu betrachten und alles über Ihr Programm für Sie zu reparieren. – Zong

+0

Es tut mir leid, wenn die Beschreibung nicht klar genug war. Ich möchte im Grunde ein Liniendiagramm mit den Daten in einer Textdatei plotten. Ich habe den Inhalt der Textdatei in der Beschreibung angegeben (Titel, Xlabel, Ylabel, etc.) – james

Antwort

2

aus Ihrem Beispiel starten, ist Folgendes zu beachten:

  • Verwenden Sie eine ChartPanel für Ihre graphicsArea; dann kann Ihr openAction() einfach setChart() aufrufen.

  • Die ausgewählte Datei in creatChart() analysieren; Die Titel- und Datenzeilen werden angezeigt, die restlichen Attribute werden jedoch als Übung belassen.

  • Verwenden Sie Properties für Ihr Dateiformat;

  • Für größere Flexibilität verwenden Sie Action wie gezeigt here.

  • Um die Standardgröße des Kartenbereichs zu ändern, überschreiben Sie getPreferredSize() wie gezeigt here.

  • Swing GUI-Objekte sollten konstruiert und manipuliert werden nur auf der event dispatch thread.

P. S. Das Diagramm sollte nur mit AWT/Swing-Bibliotheken gezeichnet werden.

Für ein einzelnes Diagramm, ersetzen ChartPanel mit JPanelpaintComponent() und das Rendern auszuführen außer Kraft setzen. Sie können Koordinaten unter Verwendung des beschriebenen Ansatzes here oder here transformieren.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

//* @see https://stackoverflow.com/a/36764715/230513 */ 
public class GUI extends JFrame { 

    public GUI() { 
     super("Data Visualiser"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     final JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 
     JMenu fileMenu = new JMenu("File"); 
     JMenu helpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(helpMenu); 

     final JMenuItem openAction = new JMenuItem("Open", new ImageIcon("images/Open-icon.png")); 
     final JMenuItem saveAction = new JMenuItem("Save", new ImageIcon("images/save-file.png")); 
     final JMenuItem exitAction = new JMenuItem("Exit", new ImageIcon("images/exit-icon.png")); 
     final JMenuItem aboutAction = new JMenuItem("About", new ImageIcon("images/about-us.png")); 

     final JTextArea textArea = new JTextArea(8, 16); 
     textArea.setFont(new Font("Serif", Font.BOLD, 16)); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     textArea.setEditable(false); 
     JScrollPane textScrollPane = new JScrollPane(textArea); 
     textScrollPane.setBorder(BorderFactory.createCompoundBorder(
      BorderFactory.createTitledBorder("Textual Representation"), 
      BorderFactory.createEmptyBorder(5, 5, 5, 5))); 

     ChartPanel graphicsArea = new ChartPanel(null); 
     graphicsArea.setBorder(BorderFactory.createCompoundBorder(
      BorderFactory.createTitledBorder("Graphical Representation"), 
      BorderFactory.createEmptyBorder(5, 5, 5, 5))); 

     JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, textScrollPane, graphicsArea); 
     splitPane.setOneTouchExpandable(true); 
     splitPane.setResizeWeight(0.5); 
     add(splitPane, BorderLayout.LINE_END); 

     fileMenu.setMnemonic(KeyEvent.VK_F); 
     fileMenu.add(openAction); 
     openAction.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (arg0.getSource().equals(openAction)) { 
        JFileChooser fileChooser = new JFileChooser(new File(".")); 
        if (fileChooser.showOpenDialog(fileChooser) == JFileChooser.APPROVE_OPTION) { 
         File file = fileChooser.getSelectedFile(); 
         graphicsArea.setChart(creatChart(file)); 
        } 
       } 
      } 

      private JFreeChart creatChart(File file) { 
       String title = null; 
       String xAxisLabel = null; 
       String yAxisLabel = null; 
       BufferedReader in = null; 
       int start = 0; 
       int interval = 0; 
       String data = null; 
       String line = null; 
       try { 
        in = new BufferedReader(new FileReader(file)); 
        while ((line = in.readLine()) != null) { 
         textArea.append(line + "\n"); 
         if (line.startsWith("Title")) { 
          title = line.split(":")[1].trim(); 
         } 
         // parse other lines here 
         if (!line.contains(":")) { 
          data = line; 
         } 
        } 
       } catch (IOException ex) { 
        ex.printStackTrace(System.err); 
       } 
       XYSeries dataset = new XYSeries(file.getName()); 
       for (String s : data.split(",")) { 
        dataset.add(start, Double.valueOf(s)); 
        start += interval; 
       } 
       return ChartFactory.createXYLineChart(title, 
        xAxisLabel, yAxisLabel, new XYSeriesCollection(dataset)); 
      } 
     }); 
     fileMenu.add(saveAction); 
     fileMenu.add(exitAction); 
     exitAction.setMnemonic(KeyEvent.VK_X); 
     exitAction.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (arg0.getSource().equals(exitAction)) { 
        System.exit(0); 
       } 
      } 
     }); 
     fileMenu.addSeparator(); 
     helpMenu.addSeparator(); 
     helpMenu.add(aboutAction); 
     aboutAction.setMnemonic(KeyEvent.VK_A); 
     aboutAction.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       JOptionPane.showMessageDialog(null, 
        "Visualization tool.", 
        "About Us", JOptionPane.PLAIN_MESSAGE); 
      } 
     }); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      new GUI(); 
     }); 
    } 
} 
+0

Vielen Dank. Aber wie kann ich den Graphen mit Swing und nicht mit anderen Bibliotheken wie jfreechart zeichnen? – james

+0

Ich würde definitiv eine Diagrammbibliothek verwenden; mehr sind [hier] (http://www.jfree.org/jfreechart/faq.html#FAQ13) zitiert. – trashgod

+0

Ich brauche dieses Diagramm nur mit AWT/Swing-Bibliotheken gezeichnet. :( – james