Lista rozwijana i odczytywanie z pliku dowolnej ilości danych

2015-01-10 13:10
ina
0

Cześć. Piszę program zawierający listę rozwijaną i mam problem. Chcę, aby po kliknięciu pojawiały mi się wykresy liniowe, tylko że nie wyświetlają się z danymi. Napisałam coś takiego. Proszę bardzo o pomoc.

import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

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.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Ramka extends JFrame  implements ActionListener{

    JComboBox<String> lista;
    JLabel tekst;
    JPanel panel, wykres;
    JFreeChart w;
    Component chartPanel;

    double a,b,c,d,f,g,h,i,j,k,l,m;

    public Ramka(){
        setTitle("Wykres");
        setSize(1000,700);
        setLocationRelativeTo(null);

        tekst = new JLabel("Wykres");
        tekst.setFont(new Font("Serif", Font.PLAIN, 20));
        tekst.setBounds(0, 0, 400, 20);

        lista = new JComboBox<String>();
        lista.setBounds(50,100, 100, 20);
        lista.addItem("1");
        lista.addItem("2");
        lista.addItem("3");
        lista.addItem("4");
        lista.addItem("5");
        lista.addActionListener(this);

        JPanel panel = new JPanel();

        add(panel);

        Container cp = getContentPane();
        cp.setLayout(new GridLayout(1,1));
        cp.setBounds(0,200,500,400);

        XYSeries series = new XYSeries("XYGraph");
        series.add(a, b);
        series.add(c, d);
        series.add(m, f);
        series.add(g, h);
        series.add(i, j);
        series.add(k, l);
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        w=ChartFactory.createXYLineChart(
                "XY Chart", "X-axis", "Y-axis", dataset,
                PlotOrientation.VERTICAL, true, true, false);
        ChartPanel chartPanel = new ChartPanel(w);
        chartPanel.setBounds(0, 200, 500, 400);
        cp.add(chartPanel);

        panel.add(tekst);

        panel.add(lista);

        panel.add(chartPanel);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
         Object zrodlo = e.getSource();
         if(zrodlo == lista){
             String wykres = (String) lista.getSelectedItem();
             if (wykres.equals("1")){
             a=1;
             b=3; 
             c=4;
             d=5;
             m=5;
             f=9;
             g=5;
             h=2;
             i=8;
             j=5;
             k=4;
             l=2;
             }
         else if (wykres.equals("2"))
             a=1;
             b=3; 
             c=4;
             d=5;
             m=5;
             f=9;
             g=5;
             h=2;
             i=8;
             j=5;
             k=4;
             l=2;
         }
         else if (wykres.equals("3")){
             a=1;
             b=3; 
             c=4;
             d=5;
             m=5;
             f=9;
             g=5;
             h=2;
             i=8;
             j=5;
             k=4;
             l=2;
         }
         else if (wykres.equals("4")){
             a=1;
             b=3; 
             c=4;
             d=5;
             m=5;
             f=9;
             g=5;
             h=2;
             i=8;
             j=5;
             k=4;
             l=2;
         }
         else if (wykres.equals("5")){
             a=1;
             b=3; 
             c=4;
             d=5;
             m=5;
             f=9;
             g=5;
             h=2;
             i=8;
             j=5;
             k=4;
             l=2;
         }

    }
}
edytowany 1x, ostatnio: bogdans, 2015-01-10 13:50
!Wstawiaj kod w znaczniki &lt;code=java&gt;&lt;/code&gt; - bogdans 2015-01-10 13:50
rekord post ma już 10h i nikt nie shejtował tego kodu - MoorfoxD 2015-01-10 23:52

Pozostało 580 znaków

2015-01-10 14:31
0

Od czego by tu zacząć... Za dużo do poprawy, więc wrzucam "gotowy" kod.

package luke.test;

import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

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.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class App extends JFrame implements ActionListener {

    JComboBox<String> lista;
    JLabel tekst;
    JPanel panel;
    JFreeChart w;
    Component chartPanel;

    double a, b, c, d, f, g, h, i, j, k, l, m;
    XYSeriesCollection dataset;

    public App() {
        setTitle("Wykres");
        setSize(1000, 700);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tekst = new JLabel("Wykres");
        tekst.setFont(new Font("Serif", Font.PLAIN, 20));
        tekst.setBounds(0, 0, 400, 20);

        lista = new JComboBox<String>();
        lista.setBounds(50, 100, 100, 20);
        lista.addItem("1");
        lista.addItem("2");
        lista.addItem("3");
        lista.addItem("4");
        lista.addItem("5");
        lista.addActionListener(this);

        panel = new JPanel();

        XYSeries series = new XYSeries("XYGraph");
        series.add(a, b);
        series.add(c, d);
        series.add(m, f);
        series.add(g, h);
        series.add(i, j);
        series.add(k, l);
        dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        w = ChartFactory.createXYLineChart(
                "XY Chart", "X-axis", "Y-axis", dataset,
                PlotOrientation.VERTICAL, true, true, false);
        chartPanel = new ChartPanel(w);
        panel.add(tekst);
        panel.add(lista);
        panel.add(chartPanel);
        add(panel);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object zrodlo = e.getSource();
        if (zrodlo == lista) {
            String wykres = (String) lista.getSelectedItem();
            if (wykres.equals("1")) {
                a = 1d;
                b = 3d;
                c = 4d;
                d = 5d;
                m = 5d;
                f = 9d;
                g = 5d;
                h = 2d;
                i = 8d;
                j = 5d;
                k = 4d;
                l = 2d;
                changeData(wykres);
            } else if (wykres.equals("2")) {
                a = 1d;
                b = 8d;
                c = 2d;
                d = 7d;
                m = 3d;
                f = 1d;
                g = 4d;
                h = 5d;
                i = 5d;
                j = 9d;
                k = 6d;
                l = 2d;
                changeData(wykres);
            } else if (wykres.equals("3")) {
                a = 1d;
                b = 3d;
                c = 4d;
                d = 5d;
                m = 5d;
                f = 9d;
                g = 5d;
                h = 2d;
                i = 8d;
                j = 5d;
                k = 4d;
                l = 2d;
                changeData(wykres);
            } else if (wykres.equals("4")) {
                a = 1d;
                b = 3d;
                c = 4d;
                d = 5d;
                m = 5d;
                f = 9d;
                g = 5d;
                h = 2d;
                i = 8d;
                j = 5d;
                k = 4d;
                l = 2d;
                changeData(wykres);
            } else if (wykres.equals("5")) {
                a = 1d;
                b = 3d;
                c = 4d;
                d = 5d;
                m = 5d;
                f = 9d;
                g = 5d;
                h = 2d;
                i = 8d;
                j = 5d;
                k = 4d;
                l = 2d;
                changeData(wykres);
            }

        }
    }

    private void changeData(String title) {
        dataset.removeAllSeries();
        XYSeries ser = new XYSeries(title);
        ser.add(a, b);
        ser.add(c, d);
        ser.add(m, f);
        ser.add(g, h);
        ser.add(i, j);
        ser.add(k, l);
        dataset.addSeries(ser);
    }

    public static void main(String[] args) {
        new App().setVisible(true);
    }
}
edytowany 1x, ostatnio: garai, 2015-01-10 14:36

Pozostało 580 znaków

2015-01-10 15:33
ina
0

Dziękuję bardzo ;) Jestem początkująca i nie wiedziałam jak z tego wybrnąć.

Edit: Mam jeszcze jedno pytanie: co muszę napisać, żeby te dane odczytać z pliku txt?

edytowany 1x, ostatnio: ina, 2015-01-10 17:25

Pozostało 580 znaków

2015-01-10 23:20
0
  1. Dobrze by było abyś miała dane w pliku uporządkowane
  2. Idealnie pasuje tu stworzenie klasy Point i utworzenie listy punktów, które będą czytane z pliku (opcjonalne)
  3. Skorzystać z następującego przykładu do czytania z pliku
    http://docs.oracle.com/javase/tutorial/essential/io/file.html

Pozostało 580 znaków

2015-01-16 09:11
ina
0

Mam zrobione odczytywanie z pliku, ale teraz chciałabym, żeby w actionPerformed zrobić tak, żeby odczytywanie danych było uogólnione. Zrobiłam tam pętlę for a później if, ale nie wiem dlaczego nie działa. Byłabym wdzięczna za pomoc.

package ramka;

public class Aktywator {

    public static void main(String[] args) {

        Ramka mojaRamka = new Ramka();
        mojaRamka.setVisible(true);

    }
}

package ramka;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

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.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Ramka extends JFrame  implements ActionListener{

    JComboBox<String> lista;
    JLabel tekst;
    JPanel panel;
    JFreeChart w;
    Component chartPanel;
    ArrayList<Dane> lista2 = new ArrayList<Dane>();
    int r;
    double a,b,c,d,f,g,h,i,j,k,l,m, xsr = 114/12, n = ((((1-xsr)*a)+((2-xsr)*b)+((3-xsr)*c)+((4-xsr)*d)+((5-xsr)*f)+
            ((6-xsr)*g)+((7-xsr)*h)+((8-xsr)*i)+((9-xsr)*j)+((10-xsr)*k)+((11-xsr)*l)+((12-xsr)*m))/((1-xsr)+(2-xsr)+(3-xsr)+
                    (4-xsr)+(5-xsr)+(6-xsr)+(7-xsr)+(8-xsr)+(9-xsr)+(10-xsr)+(11-xsr)+(12-xsr))), 
                    ysr = (a+b+c+d+f+g+h+i+j+k+l+m)/12, o = ysr-(n*xsr), y11 = (n*1)+o, y12 = (n*12)+o;
    XYSeriesCollection akcje;

    public Ramka(){

        load(lista2);
        setTitle("Notowanie akcji giełdowych");
        setSize(1000,700);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tekst = new JLabel("Notowanie akcji giełdowych");
        tekst.setFont(new Font("Serif", Font.PLAIN, 20));
        tekst.setBounds(0, 300, 400, 20);

        lista = new JComboBox<String>();
        lista.addItem("Akcja 1");
        lista.addItem("Akcja 2");
        lista.addItem("Akcja 3");
        lista.addItem("Akcja 4");
        lista.addItem("Akcja 5");
        lista.addActionListener(this);
        lista.setBounds(800,0, 100, 50);

        panel = new JPanel();

        akcje = new XYSeriesCollection();

        XYSeries serie1 = new XYSeries("Akcje");
        serie1.add(1, a);
        serie1.add(2, b);
        serie1.add(3, c);
        serie1.add(4, d);
        serie1.add(5, f);
        serie1.add(6, g);
        serie1.add(7, h);
        serie1.add(8, i);
        serie1.add(9, j);
        serie1.add(10, k);
        serie1.add(11, l);
        serie1.add(12, m);

        akcje.addSeries(serie1);

        XYSeries serie2 = new XYSeries("Średnia krocząca");
        serie2.add(2, (a+b+c)/3);
        serie2.add(3, (b+c+d)/3);
        serie2.add(4, (c+d+f)/3);
        serie2.add(5, (d+f+g)/3);
        serie2.add(6, (f+g+h)/3);
        serie2.add(7, (g+h+i)/3);
        serie2.add(8, (h+i+j)/3);
        serie2.add(9, (i+j+k)/3);
        serie2.add(10, (j+k+l)/3);
        serie2.add(11, (k+l+m)/3);

        XYSeries serie3 = new XYSeries("Trend");
        serie3.add(0, 5);
        serie3.add(12, 9);

        akcje.addSeries(serie2);

        akcje.addSeries(serie3);

        w=ChartFactory.createXYLineChart(
                "XY Chart", "Czas", "Cena", akcje,
                PlotOrientation.VERTICAL, true, true, false);

        chartPanel = new ChartPanel(w);
        chartPanel.setBounds(400, 100, 600, 500);

        panel.add(tekst);
        panel.add(lista);
        panel.add(chartPanel, BorderLayout.SOUTH);
        add(panel); 

    }

    private static void load(ArrayList <Dane> lista2) {
        File file = new File("Dane.txt");
        FileReader freader =null ;
        try {
            freader = new FileReader(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedReader breader = new BufferedReader(freader);
        lista2.clear();
        String line;
        try {
            while ((line = breader.readLine()) != null) {
                if (line.equals("Akcja")) {
                    String nazwa = breader.readLine();
                    String a = breader.readLine();
                    String b = breader.readLine();
                    String c = breader.readLine();
                    String d = breader.readLine();
                    String f = breader.readLine();
                    String g = breader.readLine();
                    String h = breader.readLine();
                    String i = breader.readLine();
                    String j = breader.readLine();
                    String k = breader.readLine();
                    String l = breader.readLine();
                    String m = breader.readLine();

                    Dane mojDokumentTekstowy = new Dane(nazwa, a, b, c, d, f, g, h, i, j, k, l, m);
                    lista2.add(mojDokumentTekstowy);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            breader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
         Object zrodlo = e.getSource();
         if(zrodlo == lista){
             String wykres = (String) lista.getSelectedItem();
             for (int r = 0; r < lista2.size(); r++){
                 if (wykres.equals(lista2.get(r)))
                 a = Double.parseDouble(lista2.get(r).geta());
                 b = Double.parseDouble(lista2.get(r).getb());
                 c = Double.parseDouble(lista2.get(r).getc());
                 d = Double.parseDouble(lista2.get(r).getd());
                 f = Double.parseDouble(lista2.get(r).getf());
                 g = Double.parseDouble(lista2.get(r).getg());
                 h = Double.parseDouble(lista2.get(r).geth());
                 i = Double.parseDouble(lista2.get(r).geti());
                 j = Double.parseDouble(lista2.get(r).getj());
                 k = Double.parseDouble(lista2.get(r).getk());
                 l = Double.parseDouble(lista2.get(r).getl());
                 m = Double.parseDouble(lista2.get(r).getm());

                 changeData(wykres);
                 }
             }
    }
    private void changeData(String title) {

        akcje.removeAllSeries();
        XYSeries serie1 = new XYSeries(title);
        serie1.add(1, a);
        serie1.add(2, b);
        serie1.add(3, c);
        serie1.add(4, d);
        serie1.add(5, f);
        serie1.add(6, g);
        serie1.add(7, h);
        serie1.add(8, i);
        serie1.add(9, j);
        serie1.add(10, k);
        serie1.add(11, l);
        serie1.add(12, m);
        akcje.addSeries(serie1);

        XYSeries serie2 = new XYSeries("Średnia krocząca");
        serie2.add(2, (a+b+c)/3);
        serie2.add(3, (b+c+d)/3);
        serie2.add(4, (c+d+f)/3);
        serie2.add(5, (d+f+g)/3);
        serie2.add(6, (f+g+h)/3);
        serie2.add(7, (g+h+i)/3);
        serie2.add(8, (h+i+j)/3);
        serie2.add(9, (i+j+k)/3);
        serie2.add(10, (j+k+l)/3);
        serie2.add(11, (k+l+m)/3);
        akcje.addSeries(serie2);

        XYSeries serie3 = new XYSeries("Trend");
        serie3.add(0, 5);
        serie3.add(12, 9);
        akcje.addSeries(serie3);
    }
}

package ramka;

import java.util.ArrayList;

public class Dane {

    private String nazwa;
    private String a;
    private String b;
    private String c;
    private String d;
    private String f;
    private String g;
    private String h;
    private String i;
    private String j;
    private String k;
    private String l;
    private String m;

    public Dane(String nazwa, String a, String b, String c, String d, String f, String g, String h, String i, String j, String k, String l, String m)
    {
        this.nazwa = nazwa;
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.f = f;
        this.g = g;
        this.h = h;
        this.i = i;
        this.j = j;
        this.k = k;
        this.l = l;
        this.m = m;

    }
    public void seta(String a) {
        this.a = a;
    }
    public String geta() {
        return a;
    }
    public void setb(String b) {
        this.b = b;
    }
    public String getb() {
        return b;
    }
    public void setc(String c) {
        this.c = c;
    }
    public String getc() {
        return c;
    }
    public void setd(String d) {
        this.d = d;
    }
    public String getd() {
        return d;
    }    
    public void setf(String f) {
        this.f = f;
    }
    public String getf() {
        return f;
    }
    public void setg(String g) {
        this.g = g;
    }
    public String getg() {
        return g;
    }    
    public void seth(String h) {
        this.h = h;
    }
    public String geth() {
        return h;
    }
    public void setj(String j) {
        this.j = j;
    }
    public String getj() {
        return j;
    }    
    public void setk(String k) {
        this.k = k;
    }
    public String getk() {
        return k;
    }
    public void seti(String i) {
        this.i = i;
    }
    public String geti() {
        return i;
    }    
    public void setl(String l) {
        this.l = l;
    }
    public String getl() {
        return l;
    }
    public void setm(String m) {
        this.m = m;
    }
    public String getm() {
        return m;
    }
}

Pozostało 580 znaków

2015-01-16 09:44
0

Nie wiem co to znaczy uogólnione ale widzę, że w na pewno "coś" tu nie gra :)

  if (wykres.equals(lista2.get(r)))

Porównujesz Stringa oraz obiekt Dane. Może chciałaś coś takiego

  if (wykres.equals(lista2.get(r).getNazwa()))//tylko dodaj tego gettera w klasie Dane
edytowany 1x, ostatnio: garai, 2015-01-16 09:45

Pozostało 580 znaków

2015-01-16 09:55
ina
0

Najpierw miałam dla wszystkich akcji pętlę if, a chciałabym tylko jedną pętlę, żeby kod nie był taki długi. Trudno mi się wysłowić :D

Pozostało 580 znaków

2015-01-16 10:06
0

Jestem ciężko kapujący więc wybacz :) ja widzę w metodzie actionPerformed jedną pętlę i warunek i powinien on działać dla każdego itemu z CB tylko zmień na to co Ci napisałem w poście wyżej oraz nazwa wykresu z pliku musi być zgodna z item z CB

Pozostało 580 znaków

2015-01-16 10:17
ina
0

Spoko :) W ogóle jestem wdzięczna za pomoc. Zrobiłam tak jak napisałeś, ale teraz na wykresie zmieniają mi się tylko pierwsza wartość akcji i pierwsza wartość średniej kroczącej.

Pozostało 580 znaków

2015-01-16 10:25
0

if powinien zawierać wszystkie parsowania +changeData a nie tylko pierwsze, dodaj klamry

Pozostało 580 znaków

2015-01-16 10:27
ina
0

Nie zwróciłam na to uwagi, działa. Jeszcze raz dzięki ;)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0