Popup

0

Witam,

moja aplikacja sklada sie z okna JFrame, w ktorym wykonuje praktycznie wszystkie operacje.
No ale wlasnie ... chcialbym, zeby czesc danych wprowadzana byla z innego, niezaleznego okna - popupa.

Co mial by zawierac ten popup ? Kilka komponentow, JLabel i moze z trzy pola JTextField. Grunt, ze po kliknieciu przycisku "Akceptuj" okno powinno sie zamknac, a dane z JTextField powinny zostac przekazane do glownego okna JFrame.

I teraz pytanie, czy Java udostepnia jakies narzedzie, ktore ulatwiloby stworzenie takiego 'popupa' ?

Jak na razie znalazlem klase: [b]OptionPane[/b], ale na przyklad OptionPane.showInputDialog("Wprowadz wspolrzedna X:") nie satysfakcjonuje mnie, ponieważ pozwala stworzyć popup tylko z jednym polem JTextField, a ja potrzebuje wprowadzić w tym samym oknie jeszcze współrzędne Y i Z.

Mam nadzieję, że jasno się wyraziłem:) Pozdrawiam

0

Jeśli JOptionPane nie satysfakcjonuje Cię, ponieważ zawiera tylko jedno pole tekstowe, czemu nie zaimplementujesz sam takiego czegoś?
Zrób sobie metodę blokującą, która stworzy takie okno i będzie czekała.. chyba wiesz jak użyć wait() i nofity() ?

0
Keraj napisał(a)

Jeśli JOptionPane nie satysfakcjonuje Cię, ponieważ zawiera tylko jedno pole tekstowe, czemu nie zaimplementujesz sam takiego czegoś?
Zrób sobie metodę blokującą, która stworzy takie okno i będzie czekała.. chyba wiesz jak użyć wait() i nofity() ?

Niestety nigdy nie uzywalem ani wait(), ani nofity(), wiec nie wiem co dokladnie masz na mysli.

Jak na razie wykombinowalem cos takiego:

import javax.swing.*;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;

public class Main {
    public static void main(String [] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                }
                catch (Exception exc) {};
               
                new Okno();
            }
        }
        );
    }
}

class Okno extends JFrame {
	JMenuBar mb;
	JMenu plik;
	JMenu obrazWektorowy;
	JMenu obrazRastrowy;
	JMenuItem wczytaj;
	JMenuItem zapisz;
	JMenuItem zamknij;
	JMenuItem obrocW;
	JMenuItem przesunW;
	JMenuItem skalujW;
	
	Uklad uklad;
	
	private ActionListener al = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == zamknij) dispose();
			else if (e.getSource() == wczytaj) {
				uklad.obrazWektorowy = new int[2][7];
				uklad.obrazWektorowy[0][0] = -100; 
				uklad.obrazWektorowy[0][1] = -100;
				uklad.obrazWektorowy[0][2] = 100;
				uklad.obrazWektorowy[0][3] = 100;
				uklad.obrazWektorowy[0][4] = -100;
				uklad.obrazWektorowy[0][5] = 0;
				uklad.obrazWektorowy[0][6] = 100;
				uklad.obrazWektorowy[1][0] = 0; 
				uklad.obrazWektorowy[1][1] = -80;
				uklad.obrazWektorowy[1][2] = -80;
				uklad.obrazWektorowy[1][3] = 0;
				uklad.obrazWektorowy[1][4] = 0;
				uklad.obrazWektorowy[1][5] = 80;
				uklad.obrazWektorowy[1][6] = 0;
				uklad.repaint();
			}
			else if (e.getSource() == obrocW) {
				new PopupObrot();
			}
		}
	};
	
	Okno() {
		super();
		setLayout(null);
		
		setBounds(10, 10, 1000, 645);
		add(uklad = new Uklad(0, 0, getWidth(), getHeight()));
		
		/* menu */
		mb = new JMenuBar();
		plik = new JMenu("Plik");
		obrazWektorowy = new JMenu("Obraz wektorowy");
		obrazRastrowy = new JMenu("Obraz rastrowy");
		
		plik.add(wczytaj = new JMenuItem("Wczytaj"));
		plik.add(zapisz = new JMenuItem("Zapisz"));
		plik.addSeparator();
		plik.add(zamknij = new JMenuItem("Zamknij"));
		obrazWektorowy.add(obrocW = new JMenuItem("Obróć"));
		obrazWektorowy.add(przesunW = new JMenuItem("Przesuń"));
		obrazWektorowy.add(skalujW = new JMenuItem("Skaluj"));
		
		zamknij.addActionListener(al);
		wczytaj.addActionListener(al);
		obrocW.addActionListener(al);
		
		mb.add(plik);
		mb.add(obrazWektorowy);
		mb.add(obrazRastrowy);
		
		setJMenuBar(mb);
		
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Grafika");
        setVisible(true);
	}
	
}

class Uklad extends JPanel {
	int[][] obrazWektorowy = null;
	
	Uklad(int x, int y, int width, int height) {
		super();
		setBounds(x, y, width, height);
		setBackground(Color.white);
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		/* uklad wspolrzednych */
		Graphics2D g2d = (Graphics2D)g;
		g2d.setColor(Color.black);
		g2d.drawLine(10, 10, 10, getHeight() - 60);
		g2d.drawLine(10, getHeight() - 60, getWidth() - 20, getHeight() - 60);
			/* przerywana kreska */
        float tab[] = {5.0F, 5.0F};
        g2d.setColor(new Color(150, 150, 150));
        g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0F, tab,1.0F));
        g2d.drawLine(10, (getHeight()-50)/2, getWidth() - 10, (getHeight()-50)/2);
        g2d.drawLine((getWidth() - 10)/2, getHeight() - 60, (getWidth() - 10)/2, 10);
        
        /* rysowanie obrazu wektorowego */
        if (obrazWektorowy != null) {
        	g2d.setColor(Color.red);
        	g2d.setStroke(new BasicStroke(1));
        	obrazWektorowy = przeksztalc(obrazWektorowy);
        	g2d.drawPolygon(obrazWektorowy[0], obrazWektorowy[1], obrazWektorowy[0].length);
        }
        
	}
	
	public int[][] przeksztalc(int[][] wspolrzedneXY) {
		int[][] pom = new int[wspolrzedneXY.length][wspolrzedneXY[0].length];
		for (int i = 0; i < wspolrzedneXY[0].length; i++) {
			pom[0][i] = wspolrzedneXY[0][i] + 495;
		}
		for (int i = 0; i < wspolrzedneXY[1].length; i++) {
			pom[1][i] = -wspolrzedneXY[1][i] + 296;
		}
		return pom;
	}
}

class PopupObrot extends JFrame {
	JTextField wspX;
	JButton ok;
	
	private ActionListener al = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			wspX.setText("la");
			dispose();
		}
	};
	
	PopupObrot() {
		super();
		setLayout(null);
		
		wspX = new JTextField();
		ok = new JButton("OK");
		
		wspX.setBounds(30, 30, 60, 30);
		ok.setBounds(30, 100, 60, 30);
		
		ok.addActionListener(al);
		
		add(wspX);
		add(ok);
		
		setBounds(200, 200, 300, 200);
        setResizable(false);
        setTitle("Obróć obraz wektorowy");
        setVisible(true);
	}
}

Chodzi tu o klase PopupObrot - problem w tym, ze nie potrafie pozniej z tego popupa, przekazac wartosci z JTextFielda do glownego okna:

	private ActionListener al = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			// w tym miejscu nalezy przekazac dane do glownego okna
			dispose();
		}
	};

0

Przekaż do okna klasy PopupObrot referencję do głównego okna

                        else if (e.getSource() == obrocW) {
                                new PopupObrot(this);
                        }
....
class PopupObrot extends JFrame {
        JTextField wspX;
        JButton ok;
        private Main parent;
       
        ........
       
        PopupObrot(Main parent) {
                super();
                this.parent=parent;

0

Tylko, ze wtedy tutaj pojawia sie problem

class Okno extends JFrame {
            ...
	
	private ActionListener al = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == zamknij) dispose();
			else if (e.getSource() == wczytaj) {
				uklad.obrazWektorowy = new int[2][7];
				uklad.obrazWektorowy[0][0] = -100; 
				uklad.obrazWektorowy[0][1] = -100;
				uklad.obrazWektorowy[0][2] = 100;
				uklad.obrazWektorowy[0][3] = 100;
				uklad.obrazWektorowy[0][4] = -100;
				uklad.obrazWektorowy[0][5] = 0;
				uklad.obrazWektorowy[0][6] = 100;
				uklad.obrazWektorowy[1][0] = 0; 
				uklad.obrazWektorowy[1][1] = -80;
				uklad.obrazWektorowy[1][2] = -80;
				uklad.obrazWektorowy[1][3] = 0;
				uklad.obrazWektorowy[1][4] = 0;
				uklad.obrazWektorowy[1][5] = 80;
				uklad.obrazWektorowy[1][6] = 0;
				uklad.repaint();
			}
			else if (e.getSource() == obrocW) {
/*TUTAJ JEST PROBLEM */
				new PopupObrot(this);
			}
		}
	};
...

Ponieważ w wyróżnionej przeze mnie lini, 'this' wcale nie wskazuje na główne okno, a na klase ActionListener, przez co kod się nawet nie skompiluje .

Masz jakiś inny pomysł, jak przekazać w tym miejscu tą referencje ?

0

Ok, sprawe przekazywania wartosci rozwiazalem ;)

Jeszcze kwestia "blokowania" glownego okna, w momencie gdy wyskakuje popup. Jak to zrobic, zeby glowne okno czekalo na akcje z popup ? Chodzi o te wspominane wait() i notify() ?

0

Przeczytaj o tym w kursie Suna, bo nie mam zamiaru tłumaczyć... (radzę przeczytać, bo możesz sobie biedy napytać)

Chcesz zatrzymać jeden wątek i czekać na akcję użytkownika (która będzie wtedy w innym wątku).
Więc główny wątek czeka. Kiedy użytkownik wciśnie przycisk ok czy cośtam, trzeba go(wątek) powiadomić, że ma kontynuować.

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