Odwołanie się do wartości z podklasy

0

Witam

Mam problem.
Chcę wykorzystać parametr k w podklasie LongTask Czy należy użyć dziedziczenia? Jakies krzaki wychodzą.
Zawęźony kod wygląda tak:

public class ProgressbarDemo extends JPanel
                             implements ActionListener {
 ....
        public ProgressbarDemo() {
        super(new BorderLayout());
        task = new LongTask();
....
        JTextField fatText=  new JTextField("200",5);
        JLabel fatLabel  = new JLabel("tluszcze");
        int k = Integer.parseInt(fatText.getText());
...
Metody
...
}
class LongTask  {
    private int lengthOfTask;
    private int current , flourInt,fatInt;
    private boolean done = false;
    private boolean canceled = false;
    private String statMessage;

    public LongTask() {
      
        lengthOfTask = 100;
    }
...
0

Czy KKKK==nn? ;-)
Przekaż do klasy LongTask referencję do klasy ProgressbarDemo, ze zmiennej k zrób pole w klasie

public class ProgressbarDemo extends JPanel
                             implements ActionListener {
        protected int k;
 ....
        public ProgressbarDemo() {
        super(new BorderLayout());
        task = new LongTask(this);
....
        JTextField fatText=  new JTextField("200",5);
        JLabel fatLabel  = new JLabel("tłuszcze");
        k = Integer.parseInt(fatText.getText());
...
Metody
...
}
class LongTask  {
    private int lengthOfTask;
    private int current , flourInt,fatInt;
    private boolean done = false;
    private boolean canceled = false;
    private String statMessage;
    private ProgressBarDemo parent;

    public LongTask(ProgressbarDemo parent) {
        this.parent=parent
     
        lengthOfTask = 100;
    }
...

i możesz w klasie LongTask używać parent.k

0

nie poprawniej byłoby dodać do klasy LongTask pole "k" i accesory do tego: getK(), setK()?

0

Poprawniej, ale chciałem prościej. Być może zmienna k jest w ogóle niepotrzebna w głównej klasie.
Wtedy chyba lepiej zmienną lokalną fatText zamienić na pole w klasie.

0

Zrobiłem troche innaczej .

Na początku dałem public static k;

a w klasie LongTAsk odwołanie ProgressBarDemo.k
i chyba działa.

Kolejne pytanie Mam klasę Progress w której dodaję do niej paski stanu i metody iteracyjne. Chciałbym żeby po starcie odpalały się jednoczesnie a działa tylko 1

package GUI;
import java.awt.*;
import GUI.ProgressbarDemo;
import java.awt.event.*;
import javax.swing.*; 

public class Progress extends JFrame {

    JProgressBar current,current2;
    JTextArea out;
    JButton find;
    Thread runner;
    int num = 90;

    public Progress() {
        super("Progress");
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout());
        current = new JProgressBar(0, 100);
        current.setValue(num);
        current.setStringPainted(true);
        pane.add(current);
        setContentPane(pane);
        
        current2 = new JProgressBar(0, 100);
        current2.setValue(num);
        current2.setStringPainted(true);
        pane.add(current2);
        setContentPane(pane);
    }


    public void iterate() {
        while (num > 0) {
            current.setValue(num);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { }
            num -= 10;
        }
    
    }


    public void iterate2() {
        while (num > 0) {
            current2.setValue(num);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { }
            num -= 5;
        }
    }
    

    public static void main(String[] arguments) {
        Progress frame = new Progress();
        frame.pack();
        frame.setVisible(true);
        
        frame.iterate();
   }
}
0

Kiepskie rozwiązanie z tym

  public static int k;

Jak będziesz miał dwa okna klasy ProgressbarDemo, to k będzie miało w obu taką samą wartość, w jednym okienku użytkownik wpisze 37, w drugim po chwili 145, to oba obiekty klasy LongTask będą widziały 145.
Pola static mają zupełnie inne przeznaczenie niż współpraca dwóch klas.

0

Kiepskie rozwiązanie z tym

  public static int k;

Jak będziesz miał dwa okna klasy ProgressbarDemo, to k będzie miało w obu taką samą wartość, w jednym okienku użytkownik wpisze 37, w drugim po chwili 145, to oba obiekty klasy LongTask będą widziały 145.
Pola static mają zupełnie inne przeznaczenie niż współpraca dwóch klas.

0

po pierwsze to nie uruchamiasz metody iterate2()

po drugie masz zmienna num, ktora jest zmniejszana w iterate(), dlatego nawet jak odpalisz iterate2 to warunek w while od razu spowoduje opuszczenie petli.

ale idea jest zapewne taka:
masz dwa wątki, które jednocześnie się uruchamiają i wykonują jakieś operacje na JProgresBarach.

U Ciebie nie ma 2 wątków.
Któraś z klas musi dziedziczyć po Thread, albo implementować Runnable. I swoje metody iterate wywołujesz przez przeciążoną metodę run().

Musisz uruchomić dwa oddzielne wątki, a nie odpalić metody jedną po drugiej.

stworz klase extend Thread, zaimplementuj run, dodaj konstruktor, ktory pozwoli inicjować num, stworz tym konstruktorem dwa egzemplarz klasy, odpal

    private class t extends Thread{
        public void run(){
            iterate();
        }
    }
i gdzies wywolujesz
        t a = new t(..);
 t b = new t(..);
    a.start();
    b.start();

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