JButton i grafika (zdarzenia)-jak?

0

Witam znow mam kolejny problem JButton, nauczylem sie jak zmieniac tlo zapomoca JButton, ale mam teraz inne zadanie Jak zrobic by po nacisnieciu na buttona wyswietlilo grafike podnim?

wiem ze do wyswietlania uzywa sie metody? = paintComponent(Graphics g)
ale jak to wykorzystac z JButton?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class grafa
{
	public static void main(String argv[])
	{
		okno p=new okno();
		p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		p.show();
		
	}
}
class okno extends JFrame
{
	public okno()
	{
		setSize(300,200);
		setBackground(SystemColor.desktop);
		setTitle("Programik wyswietlajacy kolka kwadraciki...");
		
		przyciski guziki=new przyciski();		
		Container pobiera=getContentPane();
		pobiera.add(guziki);
	}

}

class przyciski extends JPanel
{
	public przyciski()
	{
		JButton kolko=new JButton("kolko");
		JButton kwadrat=new JButton("kwadrat");
		JButton linia=new JButton("linia");
		
		add(kolko);
		add(kwadrat);
		add(linia);
		
		paintComponent kolo=new paintComponent();//tu juz jest zle
		//...
		//..
		kolko.addActionListener(kolo);
		//...
		//... 
		
	}
	/// tu nawet nie wiem  czy taka nazwa bo przecie 
	//paintComponent odpowiada za grafike a jak to zrobic by wyswietlal
	//po nacisnieciu??
	private class paintComponent implements ActionListener
	{
	 paintComponent(Graphics g)
		{
			g.fillOval(100,70,60,90);
			g.drawRect(70,30,20,30);
			g.drawLine(10,40,20,30);
		}
		public void actionPerformed(ActionEvent zdarzenie)
		{
			//....
			//tu coss
		}
		
			
	}
	
}

0

Proponuję inne rozwiazanie:

  • zdefiniuj klasę PanelekRysujący z metodą paintComponent(Graphics g)
  • dodaj do niego zmienną rysujemy typu int, która będzie decydować co panalek rysujący nam narysje
  • w metodzie paintComponent sprawdzasz wartość zmiennej rysujemy i wywołujesz odpowiednie rysowanie np. g.drawLine
  • przy obsłudze przycisków zmieniasz wartość panelekRysujacy.rysujemy na odpowiednią dla wybranego kształtu i przerysowujesz panelekRysujacy.repaint()
  • dla głównego kontenera ustaw BorderLayout
  • panel sterujący np wrzuć do NORTH
  • panelek rysujący do CENTER
  • actionListener dla przycisków może być jeden, np główna aplikacja, w ciele tej metody musisz sprawdzić, który przycisk wywołał zdarzenie: if (e.getSource().equals(kolko)) {
    //zmiana zmiennej rysujemy
    //przerysowania
0

Luuki dzieki za kolejne zainteresowanie topiciem:]

Mam prosbe jak mogbys mi opisac jak to w ogóle dziala:
tworze przycisk
tworze klase ktora cos zmienia
przypisuje akcje przyciskowi
Mam ksiazke ale jakos "trudno" autor dalmnie to opisal:/

oto kod ktory pozmieniany, ale znow nie pelny:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class grafa
{
	public static void main(String argv[])
	{
		okno p=new okno();
		p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		p.show();
		
	}
}
class okno extends JFrame
{
	public okno()
	{
		setSize(300,200);
		setBackground(SystemColor.desktop);
		setTitle("Programik wyswietlajacy kolka kwadraciki...");
		
		przyciski guziki=new przyciski();
		panelekRysujacy p=new panelekRysujacy();		
		Container pobiera=getContentPane();
		pobiera.add(BorderLayout.CENTER,guziki);
		pobiera.add(BorderLayout.NORTH,p);
	}

}

class przyciski extends JPanel
{
	public przyciski()
	{
		JButton kolko=new JButton("kolko");
		JButton kwadrat=new JButton("kwadrat");
		JButton linia=new JButton("linia");
		
		add(kolko);
		add(kwadrat);
		add(linia);
		
		//tu to co zostanie wyslane 
		panelekRysujacy oKolo=new panelekRysujacy(1);  //tu bledy w kompilatorze
		panelekRysujacy oKwadrat=new panelekRysujacy(2);//tu bledy w kompilatorze
		panelekRysujacy oLinia=new panelekRysujacy(3);//tu bledy w kompilatorze
	
		// tu guzik i jakies zadanie dalniego
		kolko.addActionListener(oKolo);//tu bledy w kompilatorze
		kwadrat.addActionListener(oKwadrat);//tu bledy w kompilatorze
		linia.addActionListener(oLinia);//tu bledy w kompilatorze
	}

	
}

class panelekRysujacy extends JPanel
{
	public void paintComponent(Graphics g)
	{
		int rysujemy;
		/**- w metodzie paintComponent sprawdzasz wartość zmiennej 
		 *rysujemy i wywołujesz odpowiednie rysowanie np. g.drawLine
		 *chodzi to o tego ifa?*/
		 if(rysujemy==1)
		 {
		 	g.setColor(Color.orange);
		 	g.fillOval(100,70,60,90);
				
		}
		else if(rysujemy==2)
		{
			g.setColor(Color.red);
			g.drawRect(70,30,20,30);
		}
		else if(rysujemy==3)
		{
			g.setColor(Color.blue);
			g.drawLine(10,20,50,30);
		}
		
	}
	//niewiem gdzie to wstawic?
	public void actionPerformed(ActionEvent zdarzenie){
		repaint();
	}
}

A czym sie rozni ten kod??(w komentarzach pytania).
I jak lepiej pisac wszystko w osobnych klasach czy tak jak tu na dole?

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

public class Test1 implements ActionListener{
	JFrame okno;
	public static void main(String args[]){
		Test1 ap=new Test1();
		ap.Operacja();
	}
	public void Operacja(){
		okno=new JFrame();
		okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton przycisk=new JButton("Zmiana koloru");
		przycisk.addActionListener(this); //co to this ??
		MojPanel panel=new MojPanel();
		okno.getContentPane().add(BorderLayout.SOUTH, przycisk);
		okno.getContentPane().add(BorderLayout.CENTER, panel);
		okno.setSize(1000,700);
		okno.setVisible(true);
	}
	public void actionPerformed(ActionEvent zd){//kiedy to sie uruchomi??
		okno.repaint();
	}
}
class MojPanel extends JPanel{ //skad on wie ze to klase ma uzyc?
		static boolean col=true;
		public void paintComponent(Graphics g){
			if(col){
				g.setColor(Color.orange); col=false;
			}
			else{
				g.setColor(Color.pink); col=true;
			}
			g.fillOval(100,100,500,500);
			
		}
}
0

dziala :-)

import javax.swing.;
import javax.swing.event.
;
import java.awt.;
import java.awt.event.
;
public class Kwadraciki extends JFrame{
JButton guzik1,guzik2;
Panelek panel1;
public Kwadraciki(){
guzik1=new JButton("kwadrat");
guzik2=new JButton("kolko");
panel1=new Panelek();
setTitle("kwadraciki");
setSize(new Dimension(600,400));
Container c=getContentPane();
c.add(guzik1,BorderLayout.SOUTH);
c.add(guzik2,BorderLayout.NORTH);
c.add(panel1,BorderLayout.CENTER);
guzik1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
panel1.flaga=false;
panel1.repaint();
}
});
guzik2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
panel1.flaga=true;
panel1.repaint();
}
});
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}

private class Panelek extends JPanel{
boolean flaga=false;
public void paint(Graphics g){
super.paint(g);
if(flaga){
g.setColor(Color.RED);
g.fillRect(50,50,50,50);

	}
	else{
		g.setColor(Color.BLUE);
		g.fillOval(50,50,50,50);
	}
}

}
public static void main(String[] args) {
Kwadraciki kw1=new Kwadraciki();
kw1.show();

}
}

0

ok dzieki za odp, tylko cholera to wszystko jest w jednej klase "kwadrat", jak lepiej pisac wszystko w jednej klasie czy w kilku??

0

jezeli dana klase (tutaj Pnelek) bedzie wykorzystywala tylko klasa Kwadrat to chyba lepiej zrealizowac ja jako prywatna klasę wewnętrzną ( jak było, żadna inna klasa nie bedzie miała do klasy wewnętrznej dostępu ), tak sie po prostu przyzwyczaiłem i tak mnie uczono, ale mozna robić to dowolnie według upodobania....

pzdr.

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