Tworzenie wielu komponentów ramek i przycisków

0

Potrzebuje wyjasnienia w pewnej kwestii jestem świeży a próbuje zrozumiec mechanizm.
Java opiera sie na obiektach stworzonych w poszczegolnych klasach i klasie ktora to wszystko obsługuje main.
Stworzyłem trzy klasy:

1.Klasa Grafika - chcę w tej klasie tworzyc nowe obiekty ramki,przyciski i łączyc je.
Mam tu stworzona ramke i przycisk ktorych szczegolowe info znajduje sie w poszczegolnych klasach.

package click;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Grafika 
{
JFrame ramka1;
JButton p1;
    
public void TworzGrafika1()
{
JFrame ramka1 = new JFrame();
JButton p1 = new JButton();
}    
    
}

2.Klasa Ramki - w tej klasie chce przechowywac informacje o dostepnych ramkach ktorych moge uzyc w klasie Grafika.

package click;
import java.awt.Color;
import javax.swing.JFrame;
public class Ramki extends Grafika
{
public Ramki()
{
ramka1.setSize(200, 200);
ramka1.setTitle("Ramka");
ramka1.setVisible(true);
ramka1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
}
}

3.Klasa Przyciski - w tej klasie chce przechowywac informacje o dostepnych przyciskach ktorych moge uzyc w klasie Grafika.

package click;
import java.awt.Color;
import javax.swing.JButton;
public class Przyciski extends Grafika
{
public Przyciski()
{
p1.setSize(50, 30);
p1.setBackground(Color.red);
}
}

Wiem, że tu jest mocno namieszane dlatego prosze o podpowiedz. Chodzi o to ze nie chce tworzyc 20 ramek i 30 przyciskow w klasie main. Potrzebuje info w jaki sposob odwolywac sie do ramek i innych komponentow.
Czy mozna uzyc tutaj static przy kazdym obiekcie, czy jest jakis lepszy sposob.

0

Kod, który pokazałeś nie jest pomieszany, jest CAŁKOWICIE bez sensu, więc analiza kodu jest bezcelowa.
Jeszcze raz Ci polecam, abyś przeczytał jakiś tutorial do Javy a potem do Swinga.

Hint: Z reguły tworzysz jedną ramkę, w której dodajesz/wymieniasz panele, które to posiadają inne komponenty np. przyciski, combo itd.

0

Tutaj masz prosty przykład. Można to zrobić na wiele sposobów.

Tworzysz sobie jeden panel z komponentami

 
package mytest;

import javax.swing.JComboBox;
import javax.swing.JPanel;

public class MyBottomPanel extends JPanel {

    private JComboBox comboBox;

    public MyBottomPanel() {
        this.comboBox = new JComboBox(new String[]{"AAA", "BBB", "CCC"});
        add(this.comboBox);
    }
    
}

Tworzysz sobie drugi panel z kompnentami

 
package mytest;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyUpperPanel extends JPanel {

    private JButton button;
    private JTextField textField;

    public MyUpperPanel() {
        this.button = new JButton();
        this.textField = new JTextField();
        setUp();
    }
    
    private void setUp(){
        button.setPreferredSize(new Dimension(20, 20));
        textField.setPreferredSize(new Dimension(50, 20));
        setLayout(new FlowLayout());
        add(this.button);
        add(this.textField);
    }
    
}

Wrzucasz panele do frame

package mytest;

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class MyFrame extends JFrame {

    private MyUpperPanel myUpperPanel;
    private MyBottomPanel myBottomPanel;

    public MyFrame() {
        this.myUpperPanel = new MyUpperPanel();
        this.myBottomPanel = new MyBottomPanel();
        
        add(myUpperPanel, BorderLayout.NORTH);
        add(myBottomPanel, BorderLayout.SOUTH);

        setSize(200, 200);
        setTitle("Ramka");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

 

i tworzysz obiekt frame w wątku EDT

 
package mytest;

import javax.swing.SwingUtilities;

public class Mytest {

    public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new MyFrame().setVisible(true);
            }
        });

    }
    
}

0

Dzieki wlasnie o to mi chodziło. Ja chciałem tworzyc worek z gotowymi przyciskami,worek z listami,checkboxami itd a pozniej mieszac to ze sobą umieszczajac w ramce ale gotowe panele są chyba przyjemniejszym rozwiazaniem.

0

Wszystko zależy co chcesz robić. Oczywiście możesz tworzyć własne komponenty rozszerzając Swinga, np. jeżeli chcesz aby wszystkie Twoje buttony wyglądały tak samo i wtedy zamiast JButton do paneli będziesz dodawał MyJButton. Z drugiej strony możesz też stworzyć kolekcje obiektów np. gdy tworzysz kalkulator nie musisz powtarzać kodu(inicjowania obiektu, rozmieszczenia go, dodania listenera) dla każdego przycisku z cyfrą tylko iterujesz się po kolekcji.

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