Prolem z przekazaniem zmiennej do innej klasy

0

Mam problem z przekazaniem wartosci zmiennej 'min' klasy Okno ,ktora jest pobierana z JSpinner'a do klasy CustomBarRenderer. Obie klasy znajduja sie w tej samej paczce. Miedzy tymi klasami posredniczy jeszcze jedna HrChartCreator- moze to cos pomoze.

**public class Okno extends javax.swing.JFrame** {

    double min;
...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        Double mini = (Double) jSpinner3.getValue();
        min = mini;
  }

...

}
   **public class CustomBarRenderer extends BarRenderer** {

        double min;

        public CustomBarRenderer() {
        }

    @Override
        public Paint getItemPaint(int row, int column) {
           ...
            if (value <= min ) {
                return Color.green;
            }
            
        }
    } 
 
**public class HrChartCreator**
{
   private String destinationDirectory = null;
   private HrDatabaseAccess databaseAccess = new HrDatabaseAccess();

   ....

       public JFreeChart BarChart(String okres, String start, String end) {
 
      JFreeChart chart = null;
        ....

         CustomBarRenderer renderer = new CustomBarRenderer();
        renderer.setDrawBarOutline(false);
        renderer.setBarPainter(new StandardBarPainter());
        renderer.setShadowVisible(false);
         ....
        return chart;
}
0

Najprościej: zastosuje model, czyli klasę opakowującą, np class Model { private double zmienna, getter, setter } i wrzuć ją do obydwu komponentów. Można skorzystać też z różnej maści listenerów, niektóre komponenty mają własne rodzaje modeli, etc

0

donkey, nigdy wcześniej czegoś takiego nie robilem wiec moge miec problemy ... ok, ale powiedz mi o co chodzi z tym dodawaniem do "obu" komponentów bo ja mam tylko jeden (jspinner).

Możecie mi wytłumaczyć dlaczego takie coś nie może być ?

Double mini = (Double) jSpinner3.getValue();
        CustomBarRenderer cbr = new CustomBarRenderer();
        cbr.min = mini;
0

A tam są klasy wewnętrzne niestatyczne? Jaka jest hierarchia klas (o ile jest)?

0

Może problem leży w odpakowaniu obiektu Double.
Spróbuj tak:

 
Double mini = (Double) jSpinner3.getValue();
        CustomBarRenderer cbr = new CustomBarRenderer();
        cbr.min = mini.doubleValue();
0
donkey7 napisał(a)

A tam są klasy wewnętrzne niestatyczne? Jaka jest hierarchia klas (o ile jest)?

Nie ma żadnych.

link123, niestety to nie to

0

Double mini = (Double) jSpinner3.getValue();
CustomBarRenderer cbr = new CustomBarRenderer();
cbr.min = mini.doubleValue();

Jeżeli dobrze widze to klase CustomBarRenderer masz w oddzielnym pliku. Więc zdefinuj getera do zmiennej min w klasie CustomBarRenderer i za pomocą niego dostań się do pola min.

cbr.getMin() = mini; 
0

Tak jest, wszystkie 3 klasy to osobne pliki.

Zrobiłem jak mówiłeś i w klasie CustomBarRenderer stworzyłem gettera:

** public class CustomBarRenderer extends BarRenderer** {

    double min;

    public CustomBarRenderer() { 
    }
    
    public double getMin() {
            return min;
    }


A w klasie Okno, mam teraz:

    Double mini = (Double) jSpinner3.getValue();

    CustomBarRenderer cbr = new CustomBarRenderer();
    cbr.getMid() = mini; <--- lecz tu mam błąd: unexpected type required: variable found: value 
0

A przechowujesz w ogóle jakąś referencję do obiektu CustomBarRenderer w Okno?

cbr.getMin() = mini;

się nie skompiluje, bo getMid() zwraca zwykłą wartość double, a nie jakiś wskaźnik czy inne cudo.
CustomBarRenderer.min jest pakietowe, zrób z tego pole prywatne i do tego gettera dodaj jeszcze settera - wtedy proste cbr.setMin(min). Ale lepiej byłoby stworzyć proponowany już model, do którego miałbyś dostęp z obydwu klas. Nie trzeba by aktualizować naraz dwóch wartości.

0

Wierzę na słowo ,że to jest najlepsze rozwiazanie ... tylko jest jeden problem ja totalnie nie wiem jak to zrobić. Poszukalem po necie cos o modelach i czytam ze swingi maja swoje modele itp ale o ich tworzeniu to nic nie znalazlem ;/

Domyślam sie ,ze mam stworzyc wewnatrz klas Okno i CustomBarRenderer klase Model:

public class Model {
            private double min, getter, setter;
        }

Ale chyba cos tam jeszcze mam chyba dodac ... mozecie mi podac linka do jakiegos cwiczenia, tutorialu z tym Modelem ?

0

Witam,
Jeżeli był by ktoś tak miły i napisał coś więcej na temat tych modeli to był bym bardzo wdzięczny. Jestem sam ciekaw w jaki sposób można to rozwiązać zamiast setterow i getterow.
POZDRAWIAM

0

Ehh nie chce mi się analizować kodu. Napiszę osobny kod obrazujący (uproszczoną) ideę modeli:

class Model<T> {

    private T wartość;

    public Model(T wartość) {
        this.wartość = wartość;
    }

    public T getWartość() {
        return wartość;
    }

    public void setWartość(T wartość) {
        this.wartość = wartość;
    }
}

class A {

    private Model<Double> model;

    public A(Model<Double> model) {
        this.model = model;
    }

    public Model<Double> getModel() {
        return model;
    }

    public void setModel(Model<Double> model) {
        this.model = model;
    }

    public void zmień() {
        model.setWartość(8.0);
    }
}

class B {

    private Model<Double> model;

    public B(Model<Double> model) {
        this.model = model;
    }

    public Model<Double> getModel() {
        return model;
    }

    public void setModel(Model<Double> model) {
        this.model = model;
    }

    public void wypisz() {
        System.out.println(model.getWartość());
    }
}

public class Main {

    public static void main(String[] args) {
        Model<Double> model = new Model<Double>(5.0);
        A a = new A(model);
        B b = new B(model);
        b.wypisz();
        a.zmień();
        b.wypisz();
    }
}
0

Ok, wykorzystałem tą klasę class Model

class Model<T> {

    private T wartość;

    public Model(T wartość) {
        this.wartość = wartość;
    }

    public T getWartość() {
        return wartość;
    }

    public void setWartość(T wartość) {
        this.wartość = wartość;
    }
}

Stworzyłem sobie klasę JFrame gdzie mam JSpinner i JButton:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        Integer i = (Integer) js.getValue();
        
        Model<Integer> model = new Model<Integer>(i);
        model.setWartość(i);

        Custom cst = new Custom();
        cst.wypisz();
    }

I dodatkowo klasę gdzie będzą wędrować wartości:

public class Custom {

    int a;

    public Custom(){

    }

    void wypisz(){

        Model<Integer> model = new Model<Integer>(a);
        a = model.getWartość();
        System.out.println("Wypisuje- "+a);
    }
}

Każda klasa znajduję sie w osobnym pliku. Ale coś to mi nie działa. Czy aby dobrze pobieram wartość w class Custom ?

0

Człowieku. Operator new służy do tworzenia nowego, oddzielnego obiektu z nowym zestawem zmiennych niestatycznych.

Model ma być współdzielony, tzn jeden raz stworzyć go operatorem new, a potem referencję przesłać do dwóch docelowych obiektów.

PS: Mały hint: w konstruktorze możesz podać ten model, albo jakimś setterem przy inicjalizacji obiektu. To podstawy programowania (obiektowego), nie wiem w ogóle jak ktoś może takie błędy walić (jak ty tutaj) poza działem Newbie.

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