Swing, pierwszy program

Odpowiedz Nowy wątek
2013-12-11 10:26

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

0

Witam, piszę swój pierwszy program w Swingu, i napisałem wszystko ale nie mam pojecia jak zrobić mechanikę

1.Nie wiem jak zrobic by pojedynczych liczb podawać ich więcej
2.Teraz jak wcisne 3 to zapisze do zmiennej 3 ( w fazie projektowania) ale jak zrobić tak by móc jeszcze znak i druga liczbe wpisać.

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Kalkulator extends JFrame implements ActionListener{

    JButton jeden,dwa,trzy,cztery,piec,szesc,siedem,osiem,dziewiec;
    JButton plus,minus,mnozenie,dzielenie;
    JLabel lsiema,lwynik;

    public Kalkulator(){

        setSize(800,500);
        setTitle("Kalkulator");
        setLayout(null);

        jeden = new JButton("1");
        jeden.setBounds(60,240,60,60);
        add(jeden);
        jeden.addActionListener(this);
        dwa = new JButton("2");
        dwa.setBounds(125,240,60,60);
        add(dwa);
        dwa.addActionListener(this);
        trzy = new JButton("3");
        trzy.setBounds(190,240,60,60);
        add(trzy);
        trzy.addActionListener(this);
        cztery = new JButton("4");
        cztery.setBounds(60,175,60,60);
        add(cztery);
        cztery.addActionListener(this);
        piec = new JButton("5");
        piec.setBounds(125,175,60,60);
        add(piec);
        piec.addActionListener(this);
        szesc = new JButton("6");
        szesc.setBounds(190,175,60,60);
        add(szesc);
        szesc.addActionListener(this);
        siedem = new JButton("7");
        siedem.setBounds(60,110,60,60);
        add(siedem);
        siedem.addActionListener(this);
        osiem = new JButton("8");
        osiem.setBounds(125,110,60,60);
        add(osiem);
        osiem.addActionListener(this);
        dziewiec = new JButton("9");
        dziewiec.setBounds(190,110,60,60);
        add(dziewiec);
        dziewiec.addActionListener(this);
        plus = new JButton("+");
        plus.setBounds(300,110,60,60);
        add(plus);
        plus.addActionListener(this);
        minus = new JButton("-");
        minus.setBounds(300,175,60,60);
        add(minus);
        minus.addActionListener(this);
        mnozenie = new JButton("*");
        mnozenie.setBounds(300,240,60,60);
        add(mnozenie);
        mnozenie.addActionListener(this);
        dzielenie = new JButton("/");
        dzielenie.setBounds(300,305,60,60);
        add(dzielenie);
        dzielenie.addActionListener(this);

        lsiema = new JLabel("");
        lsiema.setBounds(500,0,300,300);
        add(lsiema);

        lwynik = new JLabel("wynik");
        lwynik.setBounds(600,0,300,300);
        add(lwynik);

    }
    public static void main(String[] args){

        Kalkulator okienko = new Kalkulator();
        okienko.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okienko.setVisible(true);

    }
    public void actionPerformed(ActionEvent e){

        Object zrodlo = e.getSource();
        if(zrodlo==jeden){
            lsiema.setText("1");
        }
        else if (zrodlo==dwa){
            lsiema.setText("2");
        }
        else if(zrodlo==trzy){
            lsiema.setText("3");
        }
        else if(zrodlo==cztery){
            lsiema.setText("4");
        }
        else if(zrodlo==piec){
            lsiema.setText("5");
        }
        else if(zrodlo==szesc){
            lsiema.setText("6");
        }
        else if(zrodlo==siedem){
            lsiema.setText("7");
        }
        else if(zrodlo==osiem){
            lsiema.setText("8");
        }
        else if(zrodlo==dziewiec){
            lsiema.setText("9");
        }

    }
}

Pozostało 580 znaków

2013-12-11 10:32
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

1

Nie napisałes właściwie nic, a to co napisałes nadaje się tylko do skasowania.
Lekcja na dziś: tablice (robienie 10 zmiennych z buttonami, szczególnie takimi jak te tutaj to jest jakaś abominacja...)


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-12-11 10:32

Rejestracja: 9 lat temu

Ostatnio: 10 miesięcy temu

0

Po pierwsze moim zdanem do rysowania siatki przycisków powinieneś skorzystać z GridLayout:

http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html

Poza tym aby dodać cyfry do liczby powinieneś użyć:
lsiema.setText(lsiema.getText() + "1");

Poczytaj też o MVC aby oddzielić logikę działania aplikacji od widoku. No i tak jak kolega wyżej napisał poczytaj o tablicach, aby nie tworzyć na sztywno każdego przycisku, poniweaż jakbyś miał siatkę 10 x 10 to trochhę by zeszeło z wypisaniem kodu tworzącego przyciski + podanie prawidłowych rozmiarów i współrzędnych dla przycisków.

edytowany 1x, ostatnio: bakeraw2, 2013-12-11 10:34
no dobra,ale co z resztą problemów - BartoszCoyote 2013-12-11 10:44
pobrałem jakiś przykład i kogoś kod ma 150linijek :) a mój samego tworzenia buttonów 146 ... - BartoszCoyote 2013-12-11 10:57

Pozostało 580 znaków

2013-12-11 10:48
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

Zacznij od rozwiązania tych problemów które pokazaliśmy. Wszystko w swoim czasie. Jak już te problemy rozwiążesz do odkryjesz że zamiast sztywnego setText(cośtam) możesz dać edit.setText(edit.getText()+nowa_cyferka)...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-12-11 10:58

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

0

dużo pracy przede mną, robie te programy oglądając w między czasie kurs na yt

Spokojnie. Nikt z marszu Wozniakiem się nie staje :) A tak na marginesie zacznij się interesować JavaFX2, gdyż Swing powoli będzie odchodził do lamusa. - Gjorni 2013-12-11 12:04
czy ja wiem - fx'a można wstawić bez problemu w kod z swingiem. Obie technologie pozostają jakimś marginesem desktopowych aplikacji. - niezdecydowany 2013-12-11 14:23
Co nie zmienia faktu, że Swing będzie sumiennie spychany przez JFX na margines jeszcze dalszy. - Gjorni 2013-12-11 22:53

Pozostało 580 znaków

2013-12-11 11:28

Rejestracja: 9 lat temu

Ostatnio: 10 miesięcy temu

0

Poczytaj o layoutach w Swing'u oraz o tym jak używać tablic + ActionListenerów aby nie było czegoś takiego jak:

if(source == bt1) {
// instrukcja
} else if (source == bt2) {
// instrukcja
}

etc...
To można załatwić w kilku linijkach a nie w 30-40. Poza tym stwórz sobie metodę która towrzy przyciski a przyjmuję Stringa z etykietą przycisku.

a co jest złego w takiej konstrukcji? chyba że piszesz że jak stworzy tablicę buttonów to może przejechać pętlą for ale jeżeli ma różne elementy to jak to inaczej zrobić? - wojciechmaciejewski 2013-12-11 12:03
dla przycisków od 0 do 9 mozna utworzyc metodę która będzie zwracała btn o etykiecie od 0 do 9. Dlatego do utworzenia przycisków można wykorzystać pętle for od 0 do 9 w której będzie wywołanie metody createBtn(String label), a w ActionListenerze zczytać etykietę przycisku który wywołał zdarzenie i dodać wybraną liczbę do etykiety. Trochę mniej kodu (wyeliminowanie niepotrzebnych linijek na tworzenie przycisków oraz if elsy w ActionListenerze) - bakeraw2 2013-12-11 12:11
chyba że każdy z przycisków ma robić coś innego wtedy się nie obędzie tak czy siak bez if else. W tym przypadku faktycznie lepiej tak jak piszesz ale ogólnie konstrukcja jest okey - wojciechmaciejewski 2013-12-11 12:14
ogólnie tak w tym przypadku lepiej skorzystać z pętli + wyeliminować if/elsy :) - bakeraw2 2013-12-11 12:17

Pozostało 580 znaków

2013-12-11 12:40

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

0

Nie wiem czy już to pisałem ale dopiero zaczynam

Pozostało 580 znaków

2013-12-11 13:02

Rejestracja: 9 lat temu

Ostatnio: 10 miesięcy temu

0

Wiemy, ale dobrze już od razu nabierać prawidłowych praktyk, stąd nasze komenarze :)

Pozostało 580 znaków

2013-12-11 14:46

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

0

Znalazłem taki kod, przeanalizowałem i wydaje mi się że rozumiem już

import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Kalkulator extends JFrame {

    public Kalkulator() {

        initUI();
    }

    public final void initUI() {

        JPanel panel = new JPanel();

        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel.setLayout(new GridLayout(5, 5, 5, 5));

        String[] buttons = {
                "Cls", "Bck", "x", "Close", "7", "8", "9", "/", "4",
                "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"
        };

        for (int i = 0; i < buttons.length; i++) {

            if (i == 2)
                panel.add(new JLabel(buttons[i]));
            else
                panel.add(new JButton(buttons[i]));
        }

        add(panel);

        setTitle("GridLayout");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                Kalkulator ex = new Kalkulator();
                ex.setVisible(true);
            }
        });
    }
}

teraz w jaki sposób wpleść w to mechanike

Pozostało 580 znaków

2013-12-11 15:53
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

2

No bez sensu to zrobiłeś. Jak tworzysz button to od razu mu nadaj action listenera.
Ale powinienes to generować w kilku pętlach bo buttony z cyferkami będą miały jednego action listenera (zależnego od parametru) a buttony *, / czy = będą mialy swoje własne.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2013-12-11 15:54

Pozostało 580 znaków

2013-12-11 16:30

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

0
Shalom napisał(a):

No bez sensu to zrobiłeś. Jak tworzysz button to od razu mu nadaj action listenera.

.addActionListener(this);

tak czy w inny sposób? Tak będzie mi łatwiej później wartości pobrac

Pozostało 580 znaków

Odpowiedz

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