akcja po kliknięciu + metoda paintComponent()

0

Witajcie, jeśli chodzi o języka JAVA jestem początkujący, więc proszę wybaczcie, jeśli moje pytanie okaże się trywialne, jednak próbowałem sam sobie jakoś z tym poradzić, jednak bezskutecznie, więc do rzeczy.

Mój kod składa się z takich klas, głównej publicznej, JFrame'a, JPanel'a oraz mojej klasy: class akcjaPrzyciskStart implements ActionListener.

Problem tkwi w tym, że w klasie JPanel mam coś takiego:

class mojPanel extends JPanel
{	
    public void paintComponent(Graphics g)
    {		
        //tu sobie coś tam rysuje, jakieś okręgi itd		
    }
}

następnie chcę zrobić tak, żeby po wciśnieciu buttona, którego mam stworzonego w JFrame:

class mojaRamka extends JFrame
{
    public mojaRamka()
    { 
        JButton start = new JButton(" START ");
        panel1.add(start);
        akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(akcjaStart);    
    }
}

coś się rysowalo (np okrąg, obojętnie), dlatego też mam zdefiniowaną klasę:

class akcjaPrzyciskStart implements ActionListener
{
	public void actionPerformed(ActionEvent z)
	{

	}
}

jak to wpleść w tą klasę dla akcji?
z góry dzięki za pomoc

1

Możesz zrobić tak:
Wywal tego implements ActionListener z klasy z akcja i zostaw po prostu public class akcjaPrzyciskStart{}, zamiast tego:
start.addActionListener(akcjaStart);
wstaw:

 
start.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent event){
              //wywolanie obiektu twojej klasy z akcja
              akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
              }
});

I uczono mnie abym pisał nazwy klas od DużejLitery a zmienną od malejLitery. To chyba dobry nawyk ^^

0

hmmm, niezbyt rozumiem, tzn kod jest oczywiście ok, zgadza się, ale co w związku z tym?
to wszystko mam w moim JFrame:

        JButton start = new JButton(" START ", new ImageIcon("start.png"));        
        panel1.add(start);
        start.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                  akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
            }
        });

a metodę, która rysuje mam w JPanelu:

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

    }

jak z tego skorzystać?

1

Albo ja nie rozumiem co chcesz osiągnąć albo Ty coś źle tłumaczysz, jeszcze raz.
Masz główną klasę z przyciskiem, tak?

  • Twój JFrame.
    Masz klasę która coś rysuje, tak?
  • JPanel.
    I z tej klasy chcesz wywolac metodę która ten rysunek wykona a następnie co?
    a) umieści go w głównym oknie?
    b) czy umieści w innym oknie które zostanie wygenerowane w klasie JPanel?

A może ja to źle rozumiem i tobie chodzi o coś innego?

Chodzi o ten fragment:

jak to wpleść w tą klasę dla akcji?

ale co ma byc wplecione do tej klasy? Wywołanie metody? Wywołanie obiektu klasy JPanel? Czy co?

0

być może zamieszałem ;)
wobec tego jeszcze raz, w skrócie chce zrobić tak, aby po nacisnięciu buttona coś zostało narysowane, oto kod:

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

public class test3
{
	public static void main(String[] args) 
	{
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
            	JFrame2 ramka = new JFrame2();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setSize(400, 400);
                ramka.setVisible(true);
            }
        });
	}	
}

class JFrame2 extends JFrame
{
    public JFrame2()
    {
        mojPanel panel1 = new mojPanel();
        add(panel1);
        
        JButton start = new JButton(" START ", new ImageIcon("start.png"));
        panel1.add(start);
        akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(akcjaStart);       
    }

}

class mojPanel extends JPanel
{	
    public void paintComponent(Graphics g)
    {		
	    //tutaj rysuje coś od razu po uruchomieniu
            Graphics2D g2 = (Graphics2D) g;
	    Rectangle2D kwadrat = new Rectangle2D.Double(100, 100, 55, 55);
	    g2.draw(kwadrat);	
    }
}

class akcjaPrzyciskStart implements ActionListener
{
	public void actionPerformed(ActionEvent z)
	{
	//po nacisnieciu na przycisk cos jest rysowane
	}
}
1

może to cie przybliży do celu :

 
public class Main {

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

            public void run() {
                JFrame2 ramka = new JFrame2();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setSize(400, 400);
                ramka.setVisible(true);
            }
        });
    }
}

class JFrame2 extends JFrame {
mojPanel panel1 = new mojPanel();
    public JFrame2() {
        
        add(panel1);

        JButton start = new JButton(" START ", new ImageIcon("start.png"));
        panel1.add(start);
        //   akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(new akcjaPrzyciskStart());
    }
    class akcjaPrzyciskStart implements ActionListener {

    public void actionPerformed(ActionEvent z) {
       
        ((mojPanel) panel1).setI(180);

        panel1.revalidate();
        panel1.repaint();
    }
}
}

class mojPanel extends JPanel {

    int i = 100;

    void setI(int in) {
        i = in;
    }

    public void paintComponent(Graphics g) {
        //tutaj rysuje coś od razu po uruchomieniu
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D kwadrat = new Rectangle2D.Double(i, 100, 55, 55);
        g2.draw(kwadrat);
    }
}


ogólnie klasę z obsługą nasłuchu robi się jako klasę wewnętrzną(dzięki temu mamy bezpośredni dostęp do panelu)

1

Kolega wyżej proponuje przy naciśnięciu modyfikacje obiektu mojPanel.
Moje rozwiązanie pokazuje jak można dodawać i usuwać zawartość kontenera aby uzyskać jakiś efekt oczywiście możesz to połączyć z metodą kolegi.
Przerobiłem twój kod ale jak znam życie doświadczony programista ci powie ze powinieneś to rozbić na całkiem oddzielne klasy/pliki a nie trzymać w jednym co zresztą jest dość logiczne. Ponad to nie jest to jakieś super eleganckie rozwiązanie ale może naprowadzi cię na to czego szukasz.
KOD:

package test;

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

public class OknoGlowne {
	
	public static void main(String[] args) 
	{
		EventQueue.invokeLater(new Runnable(){
		 public void run()
		 {
		    JFrame2 ramka = new JFrame2();
		    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		    ramka.setSize(400, 400);
		    ramka.setVisible(true);
		 }
	});
	}        
}
		 
		class JFrame2 extends JFrame {
			private JButton start = new JButton(" START ", new ImageIcon("start.png"));
			private JButton stop = new JButton(" STOP ", new ImageIcon("start.png"));
			//robisz obiekt klasy mojPanel
			private mojPanel panel1 = new mojPanel();
			private JPanel panelMain = new JPanel();
			//robisz obiekt klasy akcjaPrzyciskStart
			private akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
			
		    public JFrame2()
		    {	   
		    	
		    	panelMain.add(start); 
		    	panelMain.add(stop); 
		        panel1.setPreferredSize(new Dimension(300,300));
		        akcjaStart.setPreferredSize(new Dimension(300,300));
		        panelMain.add(panel1);
		        
		        add(panelMain);
		        start.addActionListener(new ActionListener(){
		        	public void actionPerformed(ActionEvent evet){
		        		
		    	       
		    	       panelMain.remove(akcjaStart);
		    	       panelMain.add(panel1);
		    	        panelMain.revalidate();
		    	        panelMain.repaint();

		    	       //repaint();
		        	}
		        }); 
		        stop.addActionListener(new ActionListener(){
		        	public void actionPerformed(ActionEvent evet){
		        		//robisz obiekt klasy akcjaPrzyciskStart
		    	        
		    	        //zakladam ze narysowales sobie cos w mojpanel jako wejsciowa figure
		        		//a teraz ktos kliknal przycisk i chcesz inna figure z klasy akcjaprzyciuskustart
		    	        //wiec moglo by to wygladac tak
		    	       panelMain.remove(panel1);
		    	       panelMain.add(akcjaStart);
		    	        panelMain.revalidate();
		    	        panelMain.repaint();
		        	}
		        }); 
		        
     
		    }
		 
		}
		 
		class mojPanel extends JPanel
		{        
		    public void paintComponent(Graphics g)
		    {                
		            //tutaj rysuje coś od razu po uruchomieniu
		            Graphics2D g2 = (Graphics2D) g;
		            Rectangle2D kwadrat = new Rectangle2D.Double(100, 100, 55, 55);
		            g2.draw(kwadrat);        
		    }
		}
		 
		class akcjaPrzyciskStart extends JPanel
		{
		    public void paintComponent(Graphics g)
		    {                
		            //tutaj rysuje coś od w twojej akcjiprzycisku
		            Graphics2D g2 = (Graphics2D) g;
		            Rectangle2D kwadrat = new Rectangle2D.Double(120, 120, 175, 175);
		            g2.draw(kwadrat);        
		    }
		
		}


 

Pozdrawiam!

0

Dziękuję Wam za pomoc, teraz już mniej więcej wiem jak to powinno wyglądać.
Żeby nie zakładać nowego tematu zapytam jeszcze w tym o jedną rzecz, mianowicie chciałbym utworzyć drugi przycisk, który tym razem wymazuje to co zostało narysowane, czy jest na to jakaś metoda, która potrafi to zrobić?

1

No przecież podałem Ci rozwiązanie...
zamiast dodawać tych paneli "mojPanel" i "akcjaPrzyciskuStart" do mainPanel dodaj jeszcze jeden panel

Zamiast dodawać te rysunków (obiektów klasy mojPanel, akcjaPrzyciskStart) na przemian do mainPanel dodaj go do zawierajacyFigury a ten do głównego panelu
Zobacz:

class JFrame2 extends JFrame {
			private JButton reset = new JButton(" reset ", new ImageIcon("start.png"));
			private JButton start = new JButton(" START ", new ImageIcon("start.png"));
			private JButton stop = new JButton(" STOP ", new ImageIcon("start.png"));
			//robisz obiekt klasy mojPanel
			private mojPanel panel1 = new mojPanel();
			private JPanel panelMain = new JPanel();
			private JPanel zawierajacyFigury = new JPanel();
			//robisz obiekt klasy akcjaPrzyciskStart
			private akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
			
		    public JFrame2()
		    {	   
		    	
		    	panelMain.add(start); 
		    	panelMain.add(stop); 
		    	panelMain.add(reset);
		    	panel1.setPreferredSize(new Dimension(200,200));
		        akcjaStart.setPreferredSize(new Dimension(200,200));
		        zawierajacyFigury.setPreferredSize(new Dimension(300,300));
		        zawierajacyFigury.add(panel1);
		        panelMain.add(zawierajacyFigury);
		        
		        add(panelMain);
		        start.addActionListener(new ActionListener(){
		        	public void actionPerformed(ActionEvent evet){
		        		
		    	       
		        		zawierajacyFigury.remove(akcjaStart);
		        		zawierajacyFigury.add(panel1);
		        		zawierajacyFigury.revalidate();
		        		zawierajacyFigury.repaint();

		        	}
		        }); 
                         //przycisk restartu wywala zawartosc zawierajacyFigury
		        reset.addActionListener(new ActionListener(){
		        	public void actionPerformed(ActionEvent evet){
		        		
		        		zawierajacyFigury.removeAll();
		        		zawierajacyFigury.revalidate();
		        		zawierajacyFigury.repaint();
		        	}
		        }); 
		        stop.addActionListener(new ActionListener(){
		        	public void actionPerformed(ActionEvent evet){
		        		//robisz obiekt klasy akcjaPrzyciskStart
		    	        
		    	        //zakladam ze narysowales sobie cos w mojpanel jako wejsciowa figure
		        		//a teraz ktos kliknal przycisk i chcesz inna figure z klasy akcjaprzyciuskustart
		    	        //wiec moglo by to wygladac tak
		        		zawierajacyFigury.remove(panel1);
		        		zawierajacyFigury.add(akcjaStart);
		        		zawierajacyFigury.revalidate();
		        		zawierajacyFigury.repaint();
		        	}
		        }); 
		        
     
		    }
		 
		}
 
0

dzięki za pomoc, cóż, pozostaje mi tylko coś pokombinować z tym

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