• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sięganie do metody z innej klasy w pakiecie.

Object Storage Arubacloud
+1 głos
4,376 wizyt
pytanie zadane 15 maja 2015 w Java przez nowszy94 Bywalec (2,320 p.)

Robię właśnie program który ma w jakimś stopniu udawać painta. Wymyśliłem to sobie tak, że u góry (BorderLayout.NORTH) będę miał panel z przyciskami, zaś w środku (BorderLayout.CENTER) będę miał biały panel na którym będę rysował.

Są one w dwóch różnych plikach. W pliku górnego panelu posiadam publiczną metodę getPressedButton() która zwraca index wciśniętego klawisza. Jest ona potrzebna, żeby określić co będę rysował na centralnym panelu.

I teraz pytanie.

W jaki sposób mogę w klasie centralnego panelu skorzystać z metody z innej klasy w tym samym pakiecie?

Klasa górnego panelu:

package paint;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TopPanel extends JPanel
{
	public static final int RECTANGLE_1 = 1;
	public static final int RECTANGLE_2 = 2;
	public static final int CIRCLE_1 = 3;
	public static final int CIRCLE_2 = 4;
	
	private FirstPanel firstPanel;
	private SecondPanel secondPanel;
	private int pressedButton;
	
	public TopPanel()
	{
		initComponents();
	}

	public void initComponents() 
	{
		//setBorder(BorderFactory.createRaisedBevelBorder());
		setBorder(BorderFactory.createEmptyBorder(0,15,0,15));
		firstPanel = new FirstPanel();
		add(firstPanel);
		
		secondPanel = new SecondPanel();
		add(secondPanel);
		
	}
	
	private class FirstPanel extends JPanel
	{
		private JButton rectangleButton, secondRectangleButton;
		private JButton circleButton, secondCircleButton;
		
		public FirstPanel()
		{
			initComponents();
			initSettings();
		}
		
		private void initSettings()
		{
			setLayout(new GridLayout(2, 2, 5 , 5));
			Dimension dimension = new Dimension((int)(MainFrame.WIDTH * 0.75-15), (int)(MainFrame.HEIGHT * 0.1));
			setSize(new Dimension(dimension));
			setMinimumSize(dimension);
			setMaximumSize(dimension);
			setPreferredSize(dimension);
			setBorder(BorderFactory.createTitledBorder("Narzedza"));
			//setBackground(Color.BLUE);			
		}
		
		private void initComponents()
		{
			rectangleButton = new JButton("Prostokąt pierwszy");
			secondRectangleButton = new JButton("Prostokąt drugi");
			circleButton = new JButton("Pierwszy okrąg");
			secondCircleButton = new JButton("Drugi okrąg");
			
			rectangleButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) { pressedButton = RECTANGLE_1; }
			});
			
			secondRectangleButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) { pressedButton = RECTANGLE_2; }
			});
			
			circleButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) { pressedButton = CIRCLE_1; }
			});
			
			secondCircleButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) { pressedButton = CIRCLE_2; }
			});
			
			
			add(rectangleButton);
			add(secondRectangleButton);
			add(circleButton);
			add(secondCircleButton);
			
			pressedButton = RECTANGLE_1;
			
		}
		//public void actionPerformed(ActionEvent e) { pressedButton = RECTANGLE_1; }
	}
	
	
	public int getPressedButton(){ return pressedButton; }
	
	private class SecondPanel extends JPanel
	{
		public SecondPanel()
		{
			initComponents();
		}
		
		private void initComponents()
		{
			Dimension dimension = new Dimension((int)(MainFrame.WIDTH*0.25)-15, (int)(MainFrame.HEIGHT * 0.1));
			setSize(dimension);
			setMinimumSize(dimension);
			setMaximumSize(dimension);
			setPreferredSize(dimension);
			setBorder(BorderFactory.createTitledBorder("Atrybuty"));
		}
	}
}

Klasa środkowego panelu

package paint;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.JPanel;


public class CenterPanel extends JPanel
{
	private Point pressed, relased;
	
	public CenterPanel()
	{
		initSettings();
		initComponents();
	}
	
	private void initSettings()
	{
		Dimension dimension = new Dimension(MainFrame.WIDTH, (int)(MainFrame.HEIGHT * 0.9));
		setSize(dimension);
		setMinimumSize(dimension);
		setMaximumSize(dimension);
		setPreferredSize(dimension);
		setLocation(new Point(0, (int)(MainFrame.HEIGHT * 0.1)));
		
		setBorder(BorderFactory.createEtchedBorder());
		setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
		setBackground(Color.WHITE);
		
		addMouseListener(new KlasaZdarzenia());
	}
	public void paintComponent(Graphics g)
	{
		if(getPressedButton() == TopPanel.RECTANGLE_1) //?????????????????????????????????
			
	}
	
	private void initComponents()
	{
		pressed = new Point(-1, -1);
		relased = new Point();
	}
	
	private class KlasaZdarzenia implements MouseListener
	{
		public void mouseClicked(MouseEvent arg0) {}

		public void mouseEntered(MouseEvent arg0) {}

		public void mouseExited(MouseEvent arg0) {}

		public void mousePressed(MouseEvent e) 
		{
			if(pressed.getX() == -1)
				pressed = e.getPoint();
		}

		public void mouseReleased(MouseEvent e) 
		{
			relased = e.getPoint();
			
			
			
			
			pressed.setLocation(-1, -1);
			
		}
	}
	
	
	
}

 

1 odpowiedź

+1 głos
odpowiedź 15 maja 2015 przez Tomasz90 Nałogowiec (25,140 p.)
wybrane 15 maja 2015 przez nowszy94
 
Najlepsza
Ogólnie możesz przesłać sobie tą referencje do jednego panelu do drugiego np. w konstruktorze i w drugiej klasie zrobić sobie składową z tym Panelem. Jednak to wprowadzi duże zamieszanie w przypadku większej liczby zależności.

Możesz też spróbować klasę w której masz te wszystkie panele(dziedziczącą po JFrame) uczynić Singletonem no i wtedy w dowolnym miejscu aplikacji zwrócisz sobie referencje do tej klasy, co z kolei umożliwi Ci pobranie jej składowych czyli dowolnego panelu i wywołanie jego metod.
komentarz 15 maja 2015 przez nowszy94 Bywalec (2,320 p.)

Mam utworzony panel do którego dodane są właśnie te dwa panele, a ten panel jest dodany do klasy dziedziczącej po JFrame. Widziałem kiedys w jakims tutorialu na yt(albo na twichu) coś takiego jak opisujesz w drugim akapicie i myślałem o tym rozwiązaniu, jednak nie mam pojęcia jak go użyć.

To jest kod mojego głównego panelu:

package paint;

import java.awt.BorderLayout;

import javax.swing.JPanel;

public class MainPanel extends JPanel
{
	private TopPanel topPanel;
	private CenterPanel centerPanel;
	
	
	
	public MainPanel()
	{
		initComponents();
	}
	
	private void initComponents()
	{
		topPanel = new TopPanel();
		centerPanel = new CenterPanel();
		add(topPanel, BorderLayout.NORTH);
		add(centerPanel, BorderLayout.CENTER);
	}
	
	private int getPressedButton()
	{
		return topPanel.getPressedButton();
	}
	
}

 

Tą ostatnią metodę utworzyłem przed chwilą z myślę, że może mogę się jakoś dostać z obiektu typu TopPanel do panelu nadrzędnego, jednak nie wiem jak.

komentarz 15 maja 2015 przez Tomasz90 Nałogowiec (25,140 p.)
No to tak:

1) masz klasę MyFrame extends JFrame i w niej robisz składową private static MyFrame instance;

2) ona ma jakiś konstruktor który czynisz prywatnym

3) piszesz metodę

public static MyFrame getInstance() {

 if(instance == null) instance = new MyFrame();

return instance;

}

3) Dla klas Paneli musisz mieć stworzone gettery

No i wywołanie metody z panelu A w panelu B wygląda tak:

MyFrame.getInstance().getMainPanel().getA().methodFromPanelA();
komentarz 15 maja 2015 przez nowszy94 Bywalec (2,320 p.)
To jest to. Dziękuję!

Czy mógłbyś jeszcze wytłumaczyć mi czym jest owy singletone? Czy to jest to co opisałeś(ta statyczna metoda w klasie zawierającej inne panele)?

2) dlaczego konstruktor musi byc prywatny?
komentarz 15 maja 2015 przez Tomasz90 Nałogowiec (25,140 p.)
Singleton to wzorzec projektowy. Singleton jest jakby obiektowa alternatywą zmiennej globalnej a zarazem pozwala na tworzenie 1 instancji danej klasy.

Konstruktor jest prywatny dlatego, byś nie mógł tworzyć obiektu danej klasy za pomocą operatora new. Kod w metodzie getInstance to tzw. leniwa inicjalizacja tzn. obiekt jeśli nie istnieje zostanie utworzony, a jeżeli istnieje zostanie tylko zwrócony. Ogólnie Singleton można przerobić na Multiton, gdy wprowadzisz licznik tworzonych obiektów w klasie.

Prawdopodobnie lepszy opis znajdziesz na 99% stron w internecie jednak ogólną ideę wydaje mi się, że przedstawiłem ;D

Podobne pytania

0 głosów
1 odpowiedź 654 wizyt
pytanie zadane 24 lipca 2018 w C i C++ przez Krutek Początkujący (330 p.)
0 głosów
1 odpowiedź 333 wizyt
pytanie zadane 1 sierpnia 2019 w C i C++ przez niezalogowany
0 głosów
3 odpowiedzi 273 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...