Co zrobić aby klasa B uruchamiała się dopiero gdy dostanie dane od klasy A

0

Witam. Mam klasę A i klasę B. Klasa A ma za zadanie zebrać i odpowiednio przefiltrować dane które dostaną się do KeyListenera i utworzyć zmienną result którą po naciśnięciu ENTER przekaże do klasy B która przetworzy i wyświetli dane. Chciałbym aby klasa A uruchomiła się przy włączeniu programu natomiast klasa B powinna się uruchomić po podaniu jej danych lub przy innej akcji (np. po wciśnięciu ENTER). Co trzeba zrobić aby tak się stało? I jeszcze jedno pytanie: metodę Main w programie składającym się z kilku klas umieszcza się tam gdzie to wygodne programiście czy są jakieś standardy co do tego?

2

Na twoim poziomie możesz bezpiecznie przyjąć, że żadna klasa javy nigdy! się nie uruchamia. Jedyne to się uruchamia to metyda statyczna main.

0

No właśnie, przeciez nie da się "uruchomić klasy" :D Możesz tylko "uruchomić" metodę klasy. Czyli masz instacje B i robisz b.processData(Data data);
EDIT:
W sumie można "uruchomić" taska np. Runnable ale tak czy owak sprowadza się to tylko do wywolania run() w innym wątku :)

0

Autorowi chodzi chyba o zainicjalizowanie nowego obiektu i wywołania na nim jakiejś metody.

Do tego służy wzorzec projektowy o nazwie Obserwator.

0

Zawsze może ograniczyć użycie new poprzez implementację wzorca Prototyp!

0

Klasa A:

package Calculator;

import javax.swing.JFrame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;


public class Filter extends JFrame
{

    private String chain = "";
    private StringBuilder chainSb = new StringBuilder(chain);
    private static String resultFilter = "";
    private static boolean aBoolean = false;





    Filter()
    {
        setSize(400, 300);
        setTitle("Calculator");
        setResizable(false);
        setLayout(null);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyListener()
        {

            @Override
            public void keyTyped(KeyEvent e)
            {
                displayInfo(e);
            }

            @Override
            public void keyPressed(KeyEvent e)
            {

            }

            @Override
            public void keyReleased(KeyEvent e)
            {

            }
        });
    }


    public void addCharacter(String a)
    {
        chainSb.append(a).toString();
    }


    public static String getFilterResult()
    {
        return resultFilter;
    }


    public static String readString()
    {
        int ch;
        String r = "";
        boolean done = false;

        while (!done)
        {

            try
            {
                ch = System.in.read();

                if (ch < 0 || (char) ch == '\n')
                {
                    done = true;
                }
                else if ((char) ch != '\r')
                {
                    r = r + (char) ch;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return r;
    }


    private void displayInfo(KeyEvent e)
    {
        int id = e.getID();
        String finalKey = "";

        if (id == KeyEvent.KEY_TYPED)
        {

            char keyChar = e.getKeyChar();
            System.out.println(keyChar);
            finalKey = finalKey + keyChar;
        }


        switch (finalKey)
        {

            case ("0"):

                addCharacter("0");
                break;

            case ("1"):

                addCharacter("1");
                break;


            case ("2"):

                addCharacter("2");
                break;

            case ("3"):

                addCharacter("3");
                break;

            case ("4"):

                addCharacter("4");
                break;

            case ("5"):

                addCharacter("5");
                break;

            case ("6"):

                addCharacter("6");
                break;

            case ("7"):

                addCharacter("7");
                break;

            case ("8"):

                addCharacter("8");
                break;

            case ("9"):

                addCharacter("9");
                break;

            case ("+"):

                addCharacter("+");
                break;

            case ("-"):

                addCharacter("-");
                break;

            case ("*"):

                addCharacter("*");
                break;

            case ("/"):

                addCharacter("/");
                break;

            case ("="):


                break;

            case ("("):

                addCharacter("(");
                break;

            case (")"):

                addCharacter(")");
                break;

            case ("q"):

                System.out.println(chainSb);
                break;

            default:

                System.out.println("switch error");
                break;
        }


        if(e.getKeyChar() == KeyEvent.VK_ENTER)
        {
            resultFilter = chain + chainSb;
            aBoolean = true;
            System.out.println(aBoolean);
        }
    }
}

Klasa B:

package Calculator;

import java.util.Stack;

public class Converter
{

    static Stack stack = new Stack();


    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        Filter filter = new Filter();
        Converter converter = new Converter();

        InOriginalIsInMain();
    }


    public static void InOriginalIsInMain()
    {
        String result = "";
        String statement = "";
        boolean sign = true; //wskazuje na to, że jest to znak liczbowy (nie operator odermowania)

        System.out.println("Podaj wyrażenie");
        statement = Filter.readString();
        statement = statement.replaceAll(" ", "");

        for (int i=0; i<statement.length(); i++)
        {
            if (statement.charAt(i) == '(')
            {
                stack.push("(");
                sign = true;
                result += " ";
            }
            else if (statement.charAt(i) == ')')
            {
                result += " " + getFromStackUntilBracket();
                sign = false;
            }
            else if ((statement.charAt(i) == '+' ||
                    statement.charAt(i) == '-' ||
                    statement.charAt(i) == '*' ||
                    statement.charAt(i) == '/') && !sign)
            {
                result += " " + getFromStack(statement.substring(i, i+1));
                sign = true;
            }
            else
            {
                if (sign && statement.charAt(i) == '-')
                {
                    result += " ";
                }
                result += statement.charAt(i);
                sign = false;
            }
        }
        result += getAllFromStack();
        result = result.replaceAll("  "," " );
        System.out.println("ONP: " + result);
    }



    /**
     * Pobiera wszytkie operatory ze stosu aż do napotkania nawiasu
     * @return
     */
    private static String getFromStackUntilBracket()
    {
        String result = "";
        String c = "";

        if (!stack.empty())
        {
            c = (String) stack.pop();

            while (!c.equals("("))
            {
                result = result + " " + c;
                if (stack.empty()) break;
                c = (String) stack.pop();
            }
        }

        if (result.length() > 0)
        {
            result = " " + result;
        }
        return result;
    }


    /**
     * Pobiera wszystkie operatory o priorytecie mniejszym lub równy oepratorowi ze stosu
     * @param operator
     * @return
     */
    @SuppressWarnings("unchecked")
    private static String getFromStack(String operator)
    {
        String result = "";
        String c = null;

        if (!stack.empty())
        {
            c = (String) stack.pop();

            while (((operator.equals("+") || operator.equals("-")) && !c.equals("(")) ||
                   ((operator.equals("/") || operator.equals("*")) && (c.equals("/")  || c.equals("*"))))
            {
                result += " " + c;
                if ((stack.empty())) break;
                c = (String) stack.pop();
            }
            stack.push(c);
        }
        stack.push(operator);
        return result;
    }


    /**
     * Pobiera wszystko ze stosu
     * @return
     */
    private static String getAllFromStack()
    {
        String result = "";
        String c = null;

        while (!stack.empty())
        {
            c = (String) stack.pop();
            result += " " + c;
        }
        return result;
    }
}

Próbuję zrozumieć algorytm przekształcający wyrażenia infixowe na postfixowe. W klasie Filter jest metoda readString() którą chcę przerobić tak aby zmienna ,,ch" nie miałą wartości tego co wyczyta System.in.read(), ale ,,resultFilter", a następnie aby ta metoda (readString()) przekazała swoją wartość zmiennej ,,statement" w metodzie InOriginalIsInMain w klasie Converter.

0

Cóżeś napisał... Filter i dziedziczy po ramce? Gdzie tu logika?
Te instrukcje warunkowe są jakieś bezsensu.

I kompletnie nie rozumiem o co Ci chodzi, być może mam niskie IQ :D
W ogóle ciężko się domyśleć mi do czego ma służyć ten kod. To jest kalkulator, czy jak ?

0

Trochę pozmieniałem:

package Calculator;

import java.awt.event.KeyEvent;
import java.io.IOException;

public class Filter
{

    private static String chain = "";
    private static StringBuilder chainSb = new StringBuilder(chain);
    private static String resultFilter = "";
    private static boolean aBool = false;


    public static void addCharacter(String a)
    {
        chainSb.append(a).toString();
    }


    public static String getFilterResult()
    {
        return resultFilter;
    }


    public static String readString()
    {
        int ch;
        String r = "";
        boolean done = false;

        while (!done)
        {

            try
            {
                ch = System.in.read();

                if (ch < 0 || (char) ch == '\n')
                {
                    done = true;
                }
                else if ((char) ch != '\r')
                {
                    r = r + (char) ch;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return r;
    }


    public static boolean aBool()
    {
        return aBool;
    }


    public static void displayInfo(KeyEvent e)
    {
        int id = e.getID();
        String finalKey = "";

        if (id == KeyEvent.KEY_TYPED)
        {

            char keyChar = e.getKeyChar();
            System.out.println(keyChar);
            finalKey = finalKey + keyChar;
        }


        if (finalKey.equals("0") || finalKey.equals("1") || finalKey.equals("2") || finalKey.equals("3") ||
            finalKey.equals("4") || finalKey.equals("5") || finalKey.equals("6") || finalKey.equals("7") ||
            finalKey.equals("8") || finalKey.equals("9") || finalKey.equals("+") || finalKey.equals("-") ||
            finalKey.equals("*") || finalKey.equals("/") || finalKey.equals("(") || finalKey.equals(")"))

        {
            addCharacter(finalKey);
        }


        if (finalKey.equals("q"))
        {
            System.out.println("chainSb: " + chainSb);
            resultFilter = chain + chainSb;
            aBool = true;
            System.out.println("getFilterResult: " + getFilterResult());
            System.out.println("aBool(): " + aBool());
        }

    }
}
package Calculator;

import java.util.Stack;

public class Converter
{

    static Stack stack = new Stack();
    public static boolean a = false;


    public static void main(String[] args)
    {
        Window window = new Window();
        Filter filter = new Filter();
        Converter converter = new Converter();


        if (Filter.aBool() == true)
        {
            System.out.println(Filter.aBool());
            String result = "";
            String statement = Filter.getFilterResult();
            boolean sign = true; //wskazuje na to, że jest to znak liczbowy (nie operator odermowania)

            System.out.println("Podaj wyrażenie");
            statement = Filter.readString();
            statement = statement.replaceAll(" ", "");

            for (int i = 0; i < statement.length(); i++) {
                if (statement.charAt(i) == '(') {
                    stack.push("(");
                    sign = true;
                    result += " ";
                } else if (statement.charAt(i) == ')') {
                    result += " " + getFromStackUntilBracket();
                    sign = false;
                } else if ((statement.charAt(i) == '+' ||
                        statement.charAt(i) == '-' ||
                        statement.charAt(i) == '*' ||
                        statement.charAt(i) == '/') && !sign) {
                    result += " " + getFromStack(statement.substring(i, i + 1));
                    sign = true;
                } else {
                    if (sign && statement.charAt(i) == '-') {
                        result += " ";
                    }
                    result += statement.charAt(i);
                    sign = false;
                }
            }
            result += getAllFromStack();
            result = result.replaceAll("  ", " ");
            System.out.println("ONP: " + result);
        }
    }


    public static void InOriginalIsInMain()
    {

    }



    /**
     * Pobiera wszytkie operatory ze stosu aż do napotkania nawiasu
     * @return
     */
    private static String getFromStackUntilBracket()
    {
        String result = "";
        String c = "";

        if (!stack.empty())
        {
            c = (String) stack.pop();

            while (!c.equals("("))
            {
                result = result + " " + c;
                if (stack.empty()) break;
                c = (String) stack.pop();
            }
        }

        if (result.length() > 0)
        {
            result = " " + result;
        }
        return result;
    }


    /**
     * Pobiera wszystkie operatory o priorytecie mniejszym lub równy oepratorowi ze stosu
     * @param operator
     * @return
     */
    @SuppressWarnings("unchecked")
    private static String getFromStack(String operator)
    {
        String result = "";
        String c = null;

        if (!stack.empty())
        {
            c = (String) stack.pop();

            while (((operator.equals("+") || operator.equals("-")) && !c.equals("(")) ||
                   ((operator.equals("/") || operator.equals("*")) && (c.equals("/")  || c.equals("*"))))
            {
                result += " " + c;
                if ((stack.empty())) break;
                c = (String) stack.pop();
            }
            stack.push(c);
        }
        stack.push(operator);
        return result;
    }


    /**
     * Pobiera wszystko ze stosu
     * @return
     */
    private static String getAllFromStack()
    {
        String result = "";
        String c = null;

        while (!stack.empty())
        {
            c = (String) stack.pop();
            result += " " + c;
        }
        return result;
    }
}
package Calculator;

public class Calculator
{

}
package Calculator;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Window extends JFrame
{

    Window()
    {
        setSize(400, 300);
        setTitle("Calculator");
        setResizable(false);
        setLayout(null);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyListener()
        {

            @Override
            public void keyTyped(KeyEvent e)
            {
                Filter.displayInfo(e);
            }

            @Override
            public void keyPressed(KeyEvent e)
            {

            }

            @Override
            public void keyReleased(KeyEvent e)
            {

            }
        });
    }
}

Założenie jest takie: przy uruchomieniu programu uaktywnia sięKeyListener w klasie Window i przesyła dane do metody displayInfo() w klasie Filter która filtruje znaki które dostaną się do zmiennej resultFilter która następnie zostanie przekazana przez metodę getFilterResult() do zmiennej statement w metodzie Main w klasie Converter. Następnie klasa Converter przerobi działanie matematyczne przekazane przez getFilterResult() na takie samo działanie ale w ONP i to będzie pierwsza część programu którą chcę doprowadzić do stanu działalności jeśli tak to można ująć, a później zajmę się klasą Calculator w której wszystko będzie się obliczać. Klasa Window będzie finalnie zawierała graficzny interfejs kalkulatora (który mam już zrobiony). Chcę doprowadzić działanie do ONP bo chcę aby kalkulator zachowywał kolejność działań. Myślę, że wszytko zrozumiale napisałem.

0

Nie mieszaj lepiej GUI z logiką programu.
Jeśli jesteś początkujący, to zrób to w konsoli. Potem dodasz sobie GUI.
Spróbuj nie pisać tych instrukcji warunkowych, pomyśl, jak to zrobić inaczej. Masa ifów to nie tędy droga.

0

W załączniku jest algorytm przekształcający zapis infixowy na postfixowy pobrany z internetu. Działa dobrze więc przepisałem go do klasy Conwerter wraz ze wszystkimi potrzebnymi metodami.
Co zrobić z KeyListenerem jeśli mam nie mieszać logiki z GUI? On powinien dotyczyć jakiejś ramki czy jest jakieś inne rozwiązanie, i o które IFy ci chodzi?

0

Poczytaj o MVC, przemyśl jak to można zastosować w tym przypadku

0

Przemyśle wszystko jeszcze raz i spróbuję użyć tego MVC. Dzięki za radę.

0
IlikeJava napisał(a):

Założenie jest takie: przy uruchomieniu programu uaktywnia sięKeyListener w klasie Window i przesyła dane do metody displayInfo() w klasie Filter która filtruje znaki które dostaną się do zmiennej resultFilter która następnie zostanie przekazana przez metodę getFilterResult() do zmiennej statement w metodzie Main w klasie Converter.

No więc to Ci się na pewno nie uda w ten sposób.
Ponieważ jak spojrzysz na metode main:

public static void main(String[] args)
    {
        Window window = new Window();
        Filter filter = new Filter();
        Converter converter = new Converter();
 
        if (Filter.aBool() == true)
        {
            System.out.println(Filter.aBool());
            String result = "";
            String statement = Filter.getFilterResult();
[...]

To program wykona ją jedną po drugiej. Każdą linijkę tego main. I jak myślisz co będzie w Filter.getFilterResult(); ?
Otóż będzie na pewno ciąg pusty : "". I nie ma siły żeby nie był.
I stanie się to zanim jeszcze nawet okienko pokaże się userowi.

Musisz cały ten kod związany z liczeniem wyrażenia (od String statement = Filter.getFilterResult(); w dół) przenieśc do jakiejś metody np. calcItForMeBabe(String expression) i wywołać ta metodę jak już pozbierasz input (czyli jeśli dobrze widzę - po wciśnieciu q).

Twoje słownictwo:
Nie dośc, że jak pisałem wyużej, klasy sie nie ruchamiają . To również metodom nic się nigdy nie wysyła. Metody się wywołuje (po prostu uruchamia) (i ewentualnie z parametrami).
Przepraszam, ze się czepiam, ale mam wrażenie, że właśnie tego nie rozumiesz i Ci to bardzo przeszkadza.

Olej te wszystkie porady o MVC itp. tylko to Cie rozproszy niepotrzebnie.

0

Jeszcze jedno.

Filter________
Converter____|______  model
Calculator____|

Window ______ widok

KlasaKominikujacaSieZUzytkownikiem ______  kontroler

Dobrze rozumiem?
Metoda Main może zostać tam gdzie jest?

0

NIE ZAJMUJ SIĘ MVC i jego terminologią. Krzyczę. Z premedytacją. To nieważne. Zupełnie.

0

Dobrze

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