Obiekt własnej klasy na panelu

0

Mam napisać pewien program, jednak zupełnie nie mam pojęcia, jak :/ Muszę mieć panel a na nim obiekty swojej klasy (z tego co doczytałem, obiekty mojej klasy muszą dziedziczyć po JFrame). Ogólnie obiekty mojej klasy mają wyglądać jak tabliczki czekolady ;) - taka 2 wymiarowa tablica, (macierz), może się składać z przycisków (chyba, nie wiem, jak inaczej to rozwiązać.) Oto, co chciałym mieć: na panel mogę wrzucić dowolną ilość obiektów swojej klasy, gdzie każda tabliczka ma rozmiar podany przeze mnie - np. 2 kolumny, 3 wiersze, następna: 5 kolumn, 21 wierszy, itp ...

Jak to rozwiązać? Nie mam pojęcia, a tutoriale jakoś niespecjalnie są pomocne :/

0
  1. Poczytaj o Layout managerach w Javie
  2. Skoro ma dziedziczyc po panelu to "extends JPanel" ;p
0

GridBagLayout jest najlepszy(?) jeśli chodzi o rozmieszczanie składników:

 void buildConstraints(GridBagConstraints gbc, int gx, int gy,
        int gw, int gh, int wx, int wy) {

        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;
    }

Ale nie chce mi się objaśniać zmiennych :)

No i masz np:

GridBagConstraints constraints = new GridBagConstraints();
buildConstraints(constraints, 0, 0, 1, 1, 100, 100); 
pane.setLayout(gridbag);
gridbag.setConstraints(label1, constraints);
pane.add(label1);
0

No ja wiem do czego służy GridLayout .. znam Qt/C++ tylko kompletnie nie mogę polapać się w tym Javovym GUI ... tutoriale średnio pomagają jak pisałem - może ktoś będzie tak dobry i poda jakiś kod realizujący to, co napisałem w poprzenim poście? Z wielkim trudem i w bólach stworzyłem coś takiego:

class Chocolate extends JFrame{

    private int columns;
    private int rows;
    private JButton[][] stuffContainer;

    public Chocolate(int r, int c){

            columns = c;
            rows = r;
            
            Container cp = getContentPane();     
            cp.setLayout(new GridLayout(rows, columns));

            stuffContainer = new JButton [r][c];

            //for(int i=0; i<r; i++)
              //  stuffContainer[i] = new JButton[c];

            //for(int i=0; i<rows; i++){
              //  for(int j=0; j<columns; j++){
                //    stuffContainer[i][j].setBackground(Color.orange);
                  //  cp.add(stuffContainer[i][j]);
                //}
        //}
            pack();
            setVisible(true);
    }
}

ale daje jakiś null pointer exception Bóg wie gdzie i już nie mam pojęcia, jak to zrobić? A co dopiero, jak dodać na panel obiekty klasy Chocolate? (Nie mogę korzystać z drag&drop GUI)

0

To jest podpowiedż:

import javax.swing.*;

public class Icons extends JFrame {
    JButton[] buttons = new JButton[24];

    public Icons() {
        super("Icons");
        setSize(335, 318);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        ImageIcon icon = new ImageIcon("3dman.gif"); // Tu wstawiasz coś czym wypełnisz buttony lub skasuj linijkę bo ten gif nie działa
        for (int i = 0; i < 24; i++) {      //zakres petli ustawiasz sobie
            buttons[i] = new JButton(icon);  // jak skasujesz tamtą linijkę to usuń też odwołanie do obiektu "icon"
            pane.add(buttons[i]);
        }
        setContentPane(pane);
        setVisible(true);
    }

    public static void main(String[] arguments) {
        Icons ike = new Icons();
    }
}

 

Będziesz miał tu 24 Buttony które nie robią nic i nie nazywają się.

Tylko dodając GridBagLayout będziesz musiał nazwac każdego buttona osobno i ustawić jego miejsce i ilość zajmowanych wierszy i kolumn itd.

0

Ok, zaraz zabieram się do pisania. A jak skończę, to w jaki sposób na panelu umieścić (w okr. przeze mnie miejscu, np. na gridBagLayoucie) dowolną ilość obiektów tej mojej klasy? Da się w ogóle? W dokumentacji nie widziałem przykladów dla własnych klas..

0
  void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy){ 

//(constraints,nrKolumny,nrWiersza,ilośćZajmowanychKolumn,ilośćZajmowanychWierszy,[następne są proporcje ustaw na 100 i będzie najlepiej]100,100) 
// (constraints,0,0,1,1,100,100)  i tak będziesz musiał się pobawić aby to dobrze zrobić - taka prawda
 
        gbc.gridx = gx;    
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;
    }

przykładowy sposób konstrukcji panela

        //label
        buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
        JLabel label1 = new JLabel("label1");
        gridbag.setConstraints(label1, constraints);
        pane.add(label1);
        // next label 
        buildConstraints(constraints, 0, 1, 1, 1, 100, 100); // ustawia go obok poprzedniego 
        JLabel label2 = new JLabel("label2");
        gridbag.setConstraints(label2, constraints);
        pane.add(label2); 
0
bardzo_początkujący napisał(a)

dowolną ilość obiektów tej mojej klasy?

Robisz to za pomocą pętli z przykładu Icons

 for (int i = 0; i < 24; i++) {      //zakres petli ustawiasz sobie
    buttons[i] = new JButton();  
    pane.add(buttons[i]);   // a dokładnie tak umieszczasz swoje buttony
 }

skompilowałeś sobie ten Icons ??
Ale jeśli potrzebujesz dwu wymiarowej tablicy z czekoladkami to będzie trudniejsze jednak jak zapętlisz każdy wymiar osobno to wyjdzie chyba to samo

0

Nie rozumiem tej Javy. mniejsza z tym. Zrobiłem coś takiego:

class Chocolate extends JFrame{

        private int size;
        private JButton[] chockos;

        public Chocolate(int s){

            //ile kostek czekolady
            size = s;
            Container cp = getContentPane();
            JPanel pane = new JPanel();
            cp.setLayout(new GridLayout());

            chockos = new JButton [s];
            for(int i=0; i<size; i++)
            {
             chockos[i] = new JButton();
             chockos[i].setBackground(Color.magenta);
             chockos[i].setEnabled(false);
             cp.add(chockos[i]);
            }

            pane.add(cp);

            setContentPane(pane);
            setVisible(true);
        }
}

Nie jest to o co mi do końca chodziło ... jak ustawić te przyciski w taki sposób, że jak ktoś poda liczbe kolumn 2, a wierszy 3, to stworzy mi 2x3 = 6 przyciskow i ustawi je tak, zeby to przynajmniej chociaz troche przypomnialo tabliczke 2x3?

0

Masz przykład (ta czekolada ma paskudny kolor). Jak chcesz pytać o rozmiar, na konsoli, w okienkach?

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

public class Chocolate extends JFrame{

        private int rows;
        private int cols;
        private JButton[][] chockos;
        public static void main(String[] args)
        {
            new Chocolate(3,2);
        }

        public Chocolate(int rows,int cols)
        {

            //ile kostek czekolady
            this.rows = rows;
            this.cols =cols;
            setLayout(new GridLayout(rows,cols,1,1));

            chockos = new JButton [rows][cols];
            for(int i=0; i<rows; i++)
            {
                for(int j=0;j<cols;j++)
                {
                    chockos[i][j] = new JButton();
                    chockos[i][j].setBackground(Color.magenta);
                    add(chockos[i][j]);
                }
            }
            pack();
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
        }
}
0

Wieeeem :p ale wziąłem pierwszy lepszy ;) zaraz będę to analizować

0

Ok, już wiem mniej więcej jak działa Twój kod. Teraz mam inny problem - jak dodać dowlną ilość obiektów mojej klasy na taki przykładowy panel? Stowrzyć inną klasę? Tylko po czym ona musi dziedziczyć? Dla poniższego kodu:

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



public class Chocolate extends JFrame{

        private int rows;
        private int cols;
        private JButton[][] chockos;

        public Chocolate(int rows,int cols)
        {

            //ile kostek czekolady
            this.rows = rows;
            this.cols =cols;
            setLayout(new GridLayout(rows,cols,1,1));

            chockos = new JButton [rows][cols];
            for(int i=0; i<rows; i++)
            {
                for(int j=0;j<cols;j++)
                {
                    chockos[i][j] = new JButton();
                    chockos[i][j].setBackground(Color.LIGHT_GRAY);
                    add(chockos[i][j]);
                }
            }
            pack();
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
        }      
}

class Panel extends JFrame{

    Container cp = getContentPane();
    JPanel pane = new JPanel();

    public Panel(){
        cp.setLayout(new GridLayout());

        Chocolate c1 = new Chocolate(4,8);
        Chocolate c2 = new Chocolate(1,2);

        cp.add(c1);
        cp.add(c2);

        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

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

Mam błędy :

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
        at java.awt.Container.checkNotAWindow(Container.java:419)
        at java.awt.Container.addImpl(Container.java:1008)
        at java.awt.Container.add(Container.java:348)
        at javaapplication20.Panel.<init>(Chocolate.java:54)
        at javaapplication20.Panel.main(Chocolate.java:65)

I pojawiają mi się 2 osobne okienka o ustalonych rozmiarach. Ja chcialbym jednak umieścić te okienka w 1 wspólnym dla nich oknie, tak, żeby mieć dostęp do każdego przycisku (np. mając dostęp do głównego okna, z klasy głównego okna zmieniać kolor przycisku) tylko nie wiem, jak to wrzucic na takie wspólne okienko. A co do pytania wcześniej, to rozmiary tych tabliczek czekolady będę pobierał z pliku lub od usera. Pomoze ktoś?

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