problem z utworzeniem metody w prgoramie do rysowania figur

0

Witam. Mam taki oto problem. Tworzę program który ma rysować figury. Zaimplementowałem pakiet klas które obsługują każdą figurę, dam tu przykładową do obsługi ELIPSY, oto kod:

package klasyFigur;

import java.awt.;
import java.awt.geom.
;
/** ------------------------------------------------------------------------- */
public class Elipsa
{
public Elipsa()
{
elipsa = new Ellipse2D.Double(400,400,130,250);
kolor = new Color(69,139,116);
}

public void malujElipse(Graphics2D g2)
{
    g2.setPaint(kolor);
    g2.fill(elipsa);
}

private Ellipse2D.Double elipsa;
private Color kolor;

}

Teraz załączam główny plik programu z funkcją main i zaraz napiszę z czym mam problem.

package mainWindow;

import menuBars.MenuBar;
import menuBars.MenuElem;
import menuBars.MenuRozw;
import klasyFigur.*;

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

/** @Author Mateusz Bednarz */

public class Figury
{
public static void main(String[] args)
{
MainWindow okno = new MainWindow();
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.show();
}
}
//------------------------------------------------------------------------------
class MainWindow extends JFrame
{
public MainWindow()
{
setTitle("Program do rysowania figur");
setSize(600,750);
//setResizable(false);
ImageIcon ikona = new ImageIcon("src/ico.png");
Image ico = ikona.getImage();
setIconImage(ico);
}

    private MenuBar pasekMenu;
    private MenuRozw figura, menuPlik, menuTrans;
    private MenuElem linia, prostokat, kolo, elipsa, zakoncz, polaczFig,
            klonujFig, usunFig;
    
{
    // dołączamy do głównego okna programu pasek menu       
    pasekMenu = new MenuBar();
    
    // menu 'Plik'
    
    menuPlik = new MenuRozw("Plik");
    pasekMenu.add(menuPlik);
    
    zakoncz = new MenuElem("Zakończ");
    menuPlik.add(zakoncz);
    
    zakoncz.addActionListener(new ActionListener()
    {   
        public void actionPerformed(ActionEvent zdarzenie)
        {
            System.exit(0);
        }
    }); 
            
     // menu 'Wybór figury'
    
    figura = new MenuRozw("Wybór figury");
    pasekMenu.add(figura);
    
    linia = new MenuElem("Odcinek");
    figura.add(linia);
   
    prostokat = new MenuElem("Prostokąt");
    figura.add(prostokat);
    
    kolo = new MenuElem("Koło");
    figura.add(kolo);
    
    elipsa = new MenuElem("Elipsa");
    figura.add(elipsa);
    
    // menu 'Transformacje'
    
    menuTrans = new MenuRozw("Narzędzia");
    pasekMenu.add(menuTrans);
    
    polaczFig = new MenuElem("Połącz figury");
    menuTrans.add(polaczFig);
    
    klonujFig = new MenuElem("Klonuj figurę");
    menuTrans.add(klonujFig);
    
    usunFig = new MenuElem("Usuń figurę");
    menuTrans.add(usunFig);
    
    setJMenuBar(pasekMenu);
  
    // dołączamy panel do okna głównego programu
    
    PanelRysunku panel = new PanelRysunku();
    Container powZawartosci = getContentPane();
    powZawartosci.add(panel);
}

}
/** Panel wyświetlający figury geometryczne */

class PanelRysunku extends JPanel
{
public PanelRysunku()
{
setBackground(new Color(255,255,255));
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
}
}

Chodzi mi o to. Jak teraz zaimplementować w tym kodzie metodę i słuchacza zdarzeń który będzie mi rysował elipsę po kliknięciu na przycisk 'Elipsa'. Mam mniej więcej pojęcie o ActionListener'ach, ale próbowałem to zrobić na milion sposobów i mi nie wychodzi. Będę bardzo wdzięczny za wszelką pomoc.

Pozdro</span>

0

Robisz podobnie jak to zrobiles z zakonczeniem programu, tylko w przycisku zamiast System.exit(0); piszesz cosik takiego:
new Elipsa().malujRlipse(g);

0

Kurde, takie rozwiązanie nie działa, pisze mi błąd, że brakuje wartości 'g'. Mi się wydaje, że problem jest związany z odniesieniem do paintComponent(), i nie wiem jak ten problem rozwiązać....;-/

0

Prościej "wytłumaczyć" się już nie da:

final PanelRysunku panel = new PanelRysunku();
Container powZawartosci = getContentPane();
powZawartosci.add(panel);

elipsa.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        new Elipsa().malujElipse((Graphics2D) panel.getGraphics());
    }
});
0

Dziękówa abe, nareszcie wiem jak to zrobić, mogę ruszyć dalej z pisaniem kodu, bo się z deka zawiesiłem na tym, a że jestem początkujący to czasami ciężko mi idzie:-/ dzięki jeszcze raz:-) Pozdro

0

Mam jeszcze jeden problem. Jeżeli na moim panelu umieszczam obiekt JLabel, a mianowicie następujący fragment kodu:

twojeFigury = new JLabel("Twoje figury : ");
panel.add(twojeFigury);

Wiadomo proste. Chce żeby mój JLabel był po lewej stronie. Wykorzystuje metodę setHorizontalAlignment(SwingConstants.LEFT). Jednak jakiego parametru nie użyje mój JLabel nadal jest w tym samym miejscu. No i nie wiem, czy może w reszcie programu jest coś co uniemożliwia przesunięcie JLabel'a na poprawne miejsce??? Za wszelkie rady serdeczne dzięki ;-)

0

A jaki masz menadżer rozkładu na tym panelu ?

0

Ja to pisze w czystym kodzie, nie przez JFrame Form. Jestem początkującym programistą, i że tak zapytam...co to jest MENEDŻER ROZKŁADU???

0

Odważny jesteś, z taką znajomością Javy brać się za programy z GUI.
Menadżer rozkładu to obiekt rozmieszczający komponenty wg pewnych reguł.
Dodaj wiersz (po skonstruowaniu obiektu o nazwie panel)

panel.setLayout(new FlowLayout(FlowLayout.LEFT));

Menadżer klasy FlowLayout umieszcza komponenty jeden za drugim, jak się nie mieszczą to przechodzi do kolejnego wiersza. Domyślny menadżer dla klasy JPanel, to FlowLayout(FlowLayout.CENTER).

0

Dzięki bogdans, przydało się:-) A co od mojej odwagi, trochę mnie zmuszają do tego zajęcia, ale bardziej to moje dobre chęci do tego, żeby nauczyć się profesjonalnie programować w jakimś nowoczesnym języku i mam nadzieję, że mi się uda:-) Pzdr

0

Napisałeś

Ja to pisze w czystym kodzie, nie przez JFrame Form

Co właściwie miałeś na myśli ? Jeśli chciałeś powiedzieć, że nie używasz żadnych narzędzi do wyklikania programu, to należy Ci się pochwała. Ale jaki to ma związek z używaniem JFrame ?

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