Panel rysunkowy

0

W ramach ćwiczeń JAVA próbuję napisać programik, w którym będzie kilka pól tekstowych. Po kliknięciu na polu tekstowym prawym przyciskiem myszki i wybraniu np. "Wstaw strzałkę w prawo", powinna narysować się strzałka (na razie tylko linia). Mam jednak jakiś problem, chyba z panelem rysunkowym. Proszę o uwagi, wskazujące co robię źle.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.*;
 
public class Rysunek implements ActionListener
{
	JFrame ramka;
	PanelRysunkowy panelRysunkowy;
	JTextArea pole1, pole2, pole3, pole4, pole5, pole6;
	JPopupMenu popup;
	JMenuItem wstawStrzalkeWprawo, wstawStrzalkeWdol;
	int x, y, a, b, xPocz, yPocz, xKonc, yKonc;
	ArrayList<Line2D> listaLinii;
	Line2D linia;

	public static void main(String[] args) 
	{
           Rysunek rysunek = new Rysunek();
           rysunek.zbudujGUI();
	}
	
	public void zbudujGUI()
	{
		ramka = new JFrame();
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ramka.setExtendedState(JFrame.MAXIMIZED_BOTH);
		ramka.setLayout(null);
			
		listaLinii = new ArrayList<Line2D>();
		
		panelRysunkowy = new PanelRysunkowy();
		ramka.add(panelRysunkowy);	
		
		JTextArea[] pola = {pole1 = new JTextArea(), 
				            pole2 = new JTextArea(), 
					    pole3 = new JTextArea(),	
					    pole4 = new JTextArea(),
					    pole5 = new JTextArea(),
					    pole6 = new JTextArea(),};	 

			pole1.setBounds(100,100,200,50);
			pole2.setBounds(400,100,200,50);
			pole3.setBounds(700,100,200,50);
			pole4.setBounds(100,220,200,50);
			pole5.setBounds(400,220,200,50);
			pole6.setBounds(700,220,200,50);
			
			pole1.setName("pole1");
			pole2.setName("pole2");
			pole3.setName("pole3");
			pole4.setName("pole4");
			pole5.setName("pole5");
			pole6.setName("pole6");
			
			popup = new JPopupMenu();
			
			wstawStrzalkeWprawo = new JMenuItem("Wstaw strzałke w prawo");	
			wstawStrzalkeWdol = new JMenuItem("Wstaw strzałke w dól");
			wstawStrzalkeWprawo.addActionListener(this);
			wstawStrzalkeWdol.addActionListener(this);
		
			popup.add(wstawStrzalkeWprawo);
			popup.add(wstawStrzalkeWdol);
				
			for (JTextArea p : pola)
			{
			   p.setBackground(Color.RED);
			   p.setComponentPopupMenu(popup);
			   ramka.add(p);
			}
		
			ramka.setVisible(true);			
	}
	
	public void actionPerformed(ActionEvent e) 
	{
		Object source = e.getSource();		
		Graphics2D g2d = (Graphics2D) panelRysunkowy.getGraphics();
		
		Component invoker = popup.getInvoker();	
	        x = invoker.getLocation().x;
	        y = invoker.getLocation().y;
	        a = invoker.getBounds().width;
	        b = invoker.getBounds().height;	
			
		if (source == wstawStrzalkeWprawo)
		{									
		    xPocz = (x + a) - 50;
		    yPocz = (y + (b/2)) - 50;
		    xKonc = (x + a + 100) - 50;
		    yKonc = (y + (b/2)) - 50;
			
		    linia = new Line2D.Double(xPocz,yPocz,xKonc,yKonc);	
		    listaLinii.add(linia);
			
			for (Line2D ln : listaLinii)
			{
			   g2d.draw(ln);
			}
			panelRysunkowy.repaint();
		}
		else if (source == wstawStrzalkeWdol)
		{			
			// kod będzie później
		}	
	}
} 

	class PanelRysunkowy extends JPanel
	{
		public PanelRysunkowy()
		{
			setBounds(50,50,1300,450);
			setBorder(BorderFactory.createLineBorder(Color.black));
			setBackground(Color.ORANGE);
		}
			
	     public void paintComponent(Graphics g) 
	     {
	    	 super.paintComponents(g);
	     }
	}	
0

Cały kod rysujący ma być w metodzie paintComponent:

         public void paintComponent(Graphics g) 
         {
             super.paintComponents(g);
             //TU
         }
0

Wtedy ActionListener ma być zaimplementowany w klasie PanelRysunkowy?

0

Nie, ten kod

            Graphics2D g2d = (Graphics2D)g;
            for (Line2D ln : listaLinii)
            {
               g2d.draw(ln);
            }

przenieś we wskazane miejsce:

0

Wyskakuje jakiś problem z parametrami pętli for. Wstawiam kod klasy PanelRysunkowy, po zmianach. Co robię źle?

class PanelRysunkowy extends JPanel
	{
		Rysunek rysunek;
		
		public PanelRysunkowy()
		{
			setBounds(50,50,1300,450);
			setBorder(BorderFactory.createLineBorder(Color.black));
			setBackground(Color.ORANGE);
			
			rysunek = new Rysunek();
		}
		
	     public void paintComponent(Graphics g) 
	     {
	    	 super.paintComponents(g);
	    	 Graphics2D g2d = (Graphics2D) g;
	    	
	    	 for (Line2D ln : rysunek.listaLinii)
		 {
		    g2d.draw(ln);
		 }
	     }
	}	
0

Wreszcie "załapałem", że w poprzednim wpisie namieszałem w komunikacji pomiędzy klasami. Wydaje się, że zaczyna to działać tak jak chciałem, ale mam jeszcze prośbę o zerknięcie, czy kod z grubsza jest zgodny z zasadami programowania i nie robię jakiś podstawowych błędów.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.*;
 
public class Rysunek implements ActionListener
{
	JFrame ramka;
	PanelRysunkowy panelRysunkowy;
	JTextArea pole1, pole2, pole3, pole4, pole5, pole6;
	JPopupMenu popup;
	JMenuItem wstawStrzalkeWprawo, wstawStrzalkeWdol;
	int x, y, a, b, xPocz, yPocz, xKonc, yKonc;
	ArrayList<Line2D> listaLinii;
	Line2D linia;

	public static void main(String[] args) 
	{
      Rysunek rysunek = new Rysunek();
      rysunek.zbudujGUI();
	}
	
	public void zbudujGUI()
	{
		ramka = new JFrame();
		ramka.setSize(1000,500);
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ramka.setExtendedState(JFrame.MAXIMIZED_BOTH);
		ramka.setLayout(null);
			
		listaLinii = new ArrayList<Line2D>();
		
		panelRysunkowy = new PanelRysunkowy(this);
		ramka.add(panelRysunkowy);	
		
		JTextArea[] pola = {pole1 = new JTextArea(), 
				            pole2 = new JTextArea(), 
						    pole3 = new JTextArea(),	
						    pole4 = new JTextArea(),
						    pole5 = new JTextArea(),
						    pole6 = new JTextArea(),};	 

			pole1.setBounds(100,100,200,50);
			pole2.setBounds(400,100,200,50);
			pole3.setBounds(700,100,200,50);
			pole4.setBounds(100,220,200,50);
			pole5.setBounds(400,220,200,50);
			pole6.setBounds(700,220,200,50);
			
			pole1.setName("pole1");
			pole2.setName("pole2");
			pole3.setName("pole3");
			pole4.setName("pole4");
			pole5.setName("pole5");
			pole6.setName("pole6");
			
			popup = new JPopupMenu();
			
			wstawStrzalkeWprawo = new JMenuItem("Wstaw strzałke w prawo");	
			wstawStrzalkeWdol = new JMenuItem("Wstaw strzałke w dól");
			wstawStrzalkeWprawo.addActionListener(this);
			wstawStrzalkeWdol.addActionListener(this);
		
			popup.add(wstawStrzalkeWprawo);
			popup.add(wstawStrzalkeWdol);
				
			for (JTextArea p : pola)
			{
			   p.setBackground(Color.RED);
			   p.setComponentPopupMenu(popup);
			   ramka.add(p);
			}
		
			ramka.setVisible(true);			
	}
	
	public void actionPerformed(ActionEvent e) 
	{
		Object source = e.getSource();		
				
		Component invoker = popup.getInvoker();	
	    x = invoker.getLocation().x;
	    y = invoker.getLocation().y;
	    a = invoker.getBounds().width;
	    b = invoker.getBounds().height;	
			
		if (source == wstawStrzalkeWprawo)
		{									
		    xPocz = (x + a) - 50;
		    yPocz = (y + (b/2)) - 50;
		    xKonc = (x + a + 100) - 50;
			yKonc = (y + (b/2)) - 50;
			
			linia = new Line2D.Double(xPocz,yPocz,xKonc,yKonc);
			listaLinii.add(linia);
			panelRysunkowy.repaint();
		}
		else if (source == wstawStrzalkeWdol)
		{			
			// kod będzie później
		}	
	}
} 

	class PanelRysunkowy extends JPanel
	{
		Rysunek rysunek;
		
		public PanelRysunkowy(Rysunek rysunek)
		{
			this.rysunek = rysunek;
			setBounds(50,50,1300,450);
			setBorder(BorderFactory.createLineBorder(Color.black));
			setBackground(Color.ORANGE);
		}
		
	     public void paintComponent(Graphics g) 
	     {
	    	 super.paintComponents(g);
	    	 Graphics2D g2d = (Graphics2D) g;
	    		    	 
	    	 for (Line2D ln : rysunek.listaLinii)
				{
					g2d.draw(ln);
				}
	     }
	}	

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