2012-06-11 4 views
2

Этот код используется для создания линейного графика. Я могу отображать целые числа в TextArea, но я не могу отображать предложения над целыми числами в текстовом файле. Как исправить эту программу?Незначительный сбой в коде

Снимок экрана текстового файла приведен ниже.

Я хочу, чтобы первые три строки текстового файла также были напечатаны в TextArea.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.GridLayout; 
import java.awt.event.*; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.WindowConstants; 
import org.jfree.chart.*; 
import org.jfree.chart.plot.*; 
import org.jfree.data.xy.*; 

public class Pio { 
    static JFrame frame1 = new JFrame("Graph"); 
     static String URL = null; 
     static JTextArea txt = new JTextArea(); 
     static JPanel panel = new JPanel(); 
public static void main(String[] args) throws IOException { 

    JButton but = new JButton("Open file"); 

    ![enter image description here][2] 

    panel.add(but);  


    frame1.add(panel, BorderLayout.WEST); 

    frame1.setVisible(true); 

frame1.setSize(1000,400); 

    but.addActionListener(new ActionListener() 

         { 


         public void actionPerformed(ActionEvent e) 

         { 



         JFileChooser chooser = new JFileChooser(); 

         int ret = chooser.showDialog(null, "Open file"); 

         if (ret == JFileChooser.APPROVE_OPTION) 

          { 

          File file = chooser.getSelectedFile(); 

          URL = file.getAbsolutePath(); 

          } 

         File f = new File(URL); 

          FileReader inputF = null; 

         try { 

        inputF = new FileReader(f); 

          } 
          catch (FileNotFoundException e1) { 
                   e1.printStackTrace(); 

               } 

          BufferedReader in = new BufferedReader(inputF); 

          int[] a = new int[100]; 

             int[] b = new int[100]; 

             String s=null; 
        try { 

             s = in.readLine(); 

            } 

           catch (IOException e1) { 

            e1.printStackTrace(); 

            } 

           int i = 0; 

          while (s != null && i < 100) 

              { // your arrays can only hold 1000 ints 

             String pair[] = s.split(" "); 

             a[i] = Integer.parseInt(pair[0]); 

             b[i] = Integer.parseInt(pair[1]); 

              i++; // don't forget to increment 

              try { 

               s = in.readLine(); 

              } 

              catch (IOException e1) { 
                        e1.printStackTrace(); 
            } 
           } 

          try { 

           in.close(); 

            } 

             catch (IOException e1) { 
                      e1.printStackTrace(); 

           } 

         System.out.println("the output of the file is " + f); 

          XYSeries data = new XYSeries("Line Graph"); 

          int n = a.length; 

          for (int j = 0; j < n; j++) { 

            data.add(a[j], b[j]); 

          } 

          XYDataset xY = new XYSeriesCollection(data); 

           JFreeChart chart=ChartFactory.createXYLineChart(

             "line graph", 

              "Cycles", 

              "Temperature", 

               xY, 

              PlotOrientation.VERTICAL, 

              true, 

              true, 

              true); 

           ChartPanel p=new ChartPanel(chart); 

           p.setVisible(true); 

           p.setLocation(100,100); 

           p.setSize(500,500); 

           frame1.add(p,BorderLayout.EAST); 

             } 
         }); 
      } 

} 
+1

Является ли это действительно необходимо включить все, что файл загрузки/синтаксический анализ кода в вашем вопросе? Вы в основном хотите объединить «JFreeChart» (или «ChartPanel») с «JTextArea», и вы публикуете много кода, который не имеет никакого отношения к этому вопросу. – Robin

+0

@Robin. Я думал, что это будет легко понять. Я хочу разместить рамку для размещения на ней всех компонентов. – User689

+1

* «думал, что это будет легко понять» * 2 x ASCII-искусство (или простой рисунок) графического интерфейса легко понять. Первый должен показать графический интерфейс с минимальным размером, второй должен показать его с дополнительной шириной и высотой - для иллюстрации, где назначено дополнительное пространство. –

ответ

3

Два дисплея с двумя компонентами вы можете использовать JSplitPane.

В то время как загрузка данных в массиве добавить его к JTextArea (МАСКА1 в примере кода)

final JTextArea area1 = new JTextArea(); 
... 
area1.append("X=" + a[i] + " Y=" + b[i] + "\n"); 

Тогда вместо того, чтобы добавить диаграмму к раме добавить как таблицу и TextArea в Панель с разделителем

ChartPanel p = new ChartPanel(chart); 
JSplitPane splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
frame1.add(splitpane , BorderLayout.CENTER); 
splitpane.add(p); 
splitpane.add(area1); 
pane.validate(); 
frame1.validate(); 
frame1.repaint(); 

JSplitPane in use

Чтобы добавить данные, JTextArea использовать

area1.append("Creating a line graph\n"); 
    area1.append("Selected file " + f + "\n"); 
    while (s != null && i < 100) { // your arrays can only hold 1000 ints 
    String pair[] = s.split(" "); 
    try{ 
     a[i] = Integer.parseInt(pair[0]); 
     b[i] = Integer.parseInt(pair[1]); 
     area1.append("X=" + a[i] + " Y=" + b[i] + "\n"); 
    } catch (NumberFormatException e) { 
     area1.append(s + "\n"); 
    } 
    try { 
     s = in.readLine(); 
     i++; // don't forget to increment 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    } 
    area1.append("Finished reading data\n"); 
    ... 

В этом примере я предполагаю, что заголовок завершится ошибкой parseInt и (если есть), добавив строку s.

JTextArea

+0

Как напечатать несколько строк текста в TextArea до значений ** X ** и ** Y **? – User689

+0

@ user1448671: используйте 'append()'. – trashgod

+0

@trashgod The above screenshot - это именно то, как он выглядит. Но вместе с ** X ** и ** Y ** значениями. Я хочу напечатать несколько предложений из одного и того же текстового файла до значений ** X ** и ** Y **. – User689

4
  1. не

    там ничего о JTextArea, используйте конструктор JTextArea(int rows, int columns)

  2. положить JTextArea в JScrollPane, этот JScrollPane положить или область EAST или WEST

  3. поставил JPanel с JButton в области SOUTH или NORTH

  4. если ChartPanel не возвращает никакого PrefferedSize (я сомневаюсь, что), или это значение не является правильным, а затем установить для собственного PrefferedSize, положить ChartPanel в CENTER области

  5. как вы видели там любой строки кода о setSize, JFrame реализовала BorderLayout в API

  6. использования pack() вместо setSize()

  7. setLocation() при необходимости

  8. последние строки кода в ActionListener (Ваш код логик) должен быть

    frame.validate(); frame.repaint(); frame.pack();

  9. в этой форме (ваш код логик) является Swing GUI во FileIO безответственных для Mouse and Key Events, завернуть FileIO к Runnable#Tread или использовать SwingWorker перенаправление этой длинную и тяжелую задачу в фоновом

  10. создать ChartPanel в качестве локальных переменного (как JFram е) и первой строки кода в ActionListener должен быть

.

frame.remove(ChartPanel); 
Смежные вопросы