problem z LayoutGrid

PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Witam,
Mam za zadanie do napisania prostą aplikację. Sam algorytm jej już mam, jednak mam problem z rozmieszczeniem elementów w okienku. Fragment kodu wygląda tak:

Kopiuj
        JFrame okienko = new JFrame("Suma");
        JLabel s1 = new JLabel("0");
        JLabel s2 = new JLabel("0");
        JButton s1_inc = new JButton("+");
        JButton s2_inc = new JButton("+");
        JButton s1_dec = new JButton("-");
        JButton s2_dec = new JButton("-");
        JButton s1_zeruj = new JButton("zeruj");
        JButton s2_zeruj = new JButton("zeruj");
        JButton suma = new JButton("suma");
        
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(3, 4));
        okienko.getContentPane().add(panel);
        
        //pierwszy wiersz
        panel.add(s1_dec);//1kol
        panel.add(s1);//2kol
        panel.add(s1_inc);//3kol
        panel.add(s1_zeruj);//4kol
        
        //drugi wiersz
        panel.add(s2_dec);//1kol
        panel.add(s2);//2kol
        panel.add(s2_inc);//3kol
        panel.add(s2_zeruj);//4kol
        
        //3 wiersz
        panel.add(suma);//może byc na całej szerokosci 3 wiersza albo jakoś na środku
        
        okienko.pack();
        okienko.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okienko.setVisible(true);

Chciałbym aby elementy były rozmieszczone tak jak jest to opisane w komentarzach. Już trochę się z tym męczę i chyba zwątpiłem. Proszę o wskazówkę, bo póki co to mi wyświetla wszystkie elementy w siatce 3x3

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Daj w panelu rozkład BorderLayout, w "center" umieść kolejny panel z GridLayout(3,3), a w "south" umieść przycisk.

PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Dzięki, poprawiłem i jest ok;) Przy okazji jeszcze zapytam chociaż wiem, że to trochę odbiega od tematu wątku, jednak dotyczy tego samego kodu. W zadaniu jest powiedziane

Na ocenę programu decydujący wpływ będzie miała jakość kodu źródłowego — m.in. prawidłowe zdefiniowanie odpowiednich klas (np. klasy odpowiadającej za główne okno programu, czy klasy odpowiadającej za panel z licznikiem).

Nie wiem czy ten kod spełnia warunki zadania, w treści mowa jest o jakiś klasach(klasa odpowiadająca za panel z licznikiem), ale też nie bardzo wiem jaki jest cel ich robienia i jak to zrobić, wydaje mi się że w ten sposób jest w miarę optymalnie i prosto i przejrzyście. Oto całość kodu:

Kopiuj
package suma;

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


public class Suma {

    public static void main(String[] args) {
        JFrame okienko = new JFrame("Suma");
        JLabel s1 = new JLabel("0");
        JLabel s2 = new JLabel("0");
        JButton s1_inc = new JButton("+");
        JButton s2_inc = new JButton("+");
        JButton s1_dec = new JButton("-");
        JButton s2_dec = new JButton("-");
        JButton s1_zeruj = new JButton("zeruj");
        JButton s2_zeruj = new JButton("zeruj");
        JButton suma = new JButton("suma");
        
        JPanel panelGlowny = new JPanel();
        panelGlowny.setLayout(new BorderLayout());
        okienko.getContentPane().add(panelGlowny);
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 4));
        
        
        //pierwszy wiersz
        panel.add(s1_dec);//1kol
        panel.add(s1);//2kol
        panel.add(s1_inc);//3kol
        panel.add(s1_zeruj);//4kol
        
        //drugi wiersz
        panel.add(s2_dec);//1kol
        panel.add(s2);//2kol
        panel.add(s2_inc);//3kol
        panel.add(s2_zeruj);//4kol
        
        panelGlowny.add(panel, BorderLayout.CENTER);
        panelGlowny.add(suma, BorderLayout.SOUTH);
        
        okienko.pack();
        okienko.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okienko.setVisible(true);
        
        Inc inc_s1 = new Inc(s1);
        Inc inc_s2 = new Inc(s2);
        Dec dec_s1 = new Dec(s1);
        Dec dec_s2 = new Dec(s2);
        Zero zero_s2 = new Zero(s2);
        Zero zero_s1 = new Zero(s1);
        Dodaj dodaj = new Dodaj(s1, s2);
        
        
        s1_inc.addActionListener(inc_s1);
        s2_inc.addActionListener(inc_s2);
        s1_dec.addActionListener(dec_s1);
        s2_dec.addActionListener(dec_s2);
        s1_zeruj.addActionListener(zero_s1);
        s2_zeruj.addActionListener(zero_s2);
        suma.addActionListener(dodaj);
    }
}
class Inc implements ActionListener{
    private JLabel skladnik;

    public Inc(JLabel skladnik) {
        this.skladnik = skladnik;
    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        skladnik.setText(Integer.toString(Integer.parseInt(skladnik.getText())+1));
    }    
}

class Dec implements ActionListener{
    private JLabel skladnik;

    public Dec(JLabel skladnik) {
        this.skladnik = skladnik;
    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        skladnik.setText(Integer.toString(Integer.parseInt(skladnik.getText())-1));
    }    
}

class Zero implements ActionListener{
    private JLabel skladnik;

    public Zero(JLabel skladnik) {
        this.skladnik = skladnik;
    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        skladnik.setText("0");
    }    
}

class Dodaj implements ActionListener{
    private JLabel s1;
    private JLabel s2;
    private int suma;

    public Dodaj(JLabel s1, JLabel s2) {
        this.s1 = s1;
        this.s2 = s2;
    }        

    @Override
    public void actionPerformed(ActionEvent e) {
        suma = Integer.parseInt(s1.getText()) + Integer.parseInt(s2.getText());
        JOptionPane.showMessageDialog(null, "Suma liczników: "+Integer.toString(suma), "Suma", JOptionPane.INFORMATION_MESSAGE);
    }    
}
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Ogólnie wydaje mi się, że jest ok, z tym że kod, który znajduje się w mainie powinien znajdować się w osobnej klasie konstruującej okno z panelem licznika. Metoda main powinna jedynie wywoływać metodę setVisible(true) dla obiektu typu JFrame, np.

Kopiuj
public class OknoLicznika extends JFrame {
    
    public OknoLicznika() {
        //tutaj następuje konstrukcja całego okna
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override public void run() {
                new OknoLicznika().setVisible(true);
            }
        });
    }
} 
PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
0

Ok, dzięki;) teraz jest chyba już ok, rozbiłem tez klasy Dec, Inc, Dodaj, Zero do klas w oddzielnych plikach.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.