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();
}
};