[JAVA] Vyskakovacie okno s moznostou zadavania vstupov

Programovacie jazyky, rady, poradňa...
Jasty
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 240
Registrovaný: 13 mar 2008, 19:22

Príspevok od používateľa Jasty »

Zdravim,

mam triedu, v ktorej je GUI celej aplikacie a potreboval by som, aby mi to po zavolani metody askOnProps() splnalo taku istu funkcnost ako doteraz.

Kód: Vybrať všetko

protected int[] askOnProps() {
		int[] result = new int[2];
		String input;
		input = JOptionPane.showInputDialog(askOnProps, "Enter the heigh of the table: ", "5");
		result[0] = Integer.parseInt(input);
		input = JOptionPane.showInputDialog(askOnProps, "Enter the width of the table: ", "3");
		result[1] = Integer.parseInt(input);
		return result;
	}
Potreboval by som docielit takuto istu funkcnost, len mi bolo povedane, ze tam nemam pouzivat JOptionPane :(, tak jaksi to nie som schopny rozbehat.

Ak by sa nasla nejaka dobra dusa, co by to dokazala prerobit na nejaku takuto podobu, bol by som vdacny: napr. zeby vyskocilo okienko a bol by v prvom riadku len napis "Enter the dimensions of time table" a pod tym by boli text "vyska" a JSpinner "x" "sirka" a JSpinner. A vracalo by to to dvojprvkove pole result naplnene hodnotami z tych JSpinnerov.

//autoeditácia príspevku ( 27 Dec 2009, 22:48 )
Hm, ked nic, tak aspon nejaka rada by nebola?
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Príspevok od používateľa COTHW »

fuuuu toto je troška moc na mňa, ale čo viem hodnoty sa dajú načítavať aj cez triedu Scanner. Jednoduchý príklad:

Scanner vstup = new Scanner (System.in);
int x = vstup.nextInt();

samozrejme nad main treba vybrať knižnicu (import.java.util.Scanner;)

neviem či ti to pomohla ale hádam jo ...
Jasty
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 240
Registrovaný: 13 mar 2008, 19:22

Príspevok od používateľa Jasty »

To co si napisal je sice fajn, ale pre moj pripad nepouzitelne. Navyse sa jedna o GUI, cize neviem, ci by sa vobec dalo s triedou Scanner vobec uvazovat.

Ja uz som viac menej vytvoril nove okno podla mojho popisu vyssie, ale neviem ako tie hodnoty z neho dostat do tej mojej metody :/
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Príspevok od používateľa pheo »

Takze si ujasnime co chces: chces nejake vyskakovacie okno - skus pouzit JDialog ked nie JOptionPane
Jasty
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 240
Registrovaný: 13 mar 2008, 19:22

Príspevok od používateľa Jasty »

No asi takto. Hlavna aplikacia bezi pod jednou triedou a v nej mam metodu uvedenu vyssie. Tak som odtial vyhodil povodny odsah a dal do nej novu triedu, v ktorej mam toto primitivne okno (priloha).

Co sa tyka kodu, tak tam mam momentalne toto:

Kód: Vybrať všetko

protected int[] askOnProps() {
		int[] result = new int[2];
	
		
		class Okno extends JFrame {
			public int[] result;
			.
			.
			.
				btOk = new JButton("start");
				btOk.addActionListener(new ActionListener() {					
					public void actionPerformed(ActionEvent arg0) {
						result[0] = (Integer) width.getValue();
						result[1] = (Integer) height.getValue();
					}
				});
			.
			.
			.
		}
	
		Okno popup = new Okno();
		popup.requestFocus();
		
		System.out.println(popup.result);
		return popup.result;
	}
A moj hlavny problem spociva v tom, ze neviem ako hodnoty z tych JSpinnerov preniest spat do tej hlavnej aplikacie + ta hlavna aplikacia padne skor nez toto stihne neico urobit. Preto potrebujem najst sposob, ako akoby zastavit beh tej hlavnej, spustit toto, zadat udaje, predat ich hlavnej a pustit hlavnu.
Prílohy
Okno
Okno
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Príspevok od používateľa pheo »

No jednoducho :) pouzijes dedenie,
spravi si vlastny JFrame:

Kód: Vybrať všetko

class MyFrame extends JFrame {

    public MyFrame(String name) {
          super(name);
          add(......);
    }

   public int     getValueFrom1() { ... }
   public int     getValueFrom2() { ... }
}
(pisem kod bez kontroly ... )

Apropo problemu s tym zastavenim .... aby si dosiahol modalitu (zastavi sa beh v okne pokial sa nevypne dialog) tak sa mrkni na ten jdialog (pouzi namiesto jframe), nejake demo tu

Kód: Vybrať všetko

http://java.sun.com/docs/books/tutorial/uiswing/examples/components/index.html#DialogDemo
Jasty
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 240
Registrovaný: 13 mar 2008, 19:22

Príspevok od používateľa Jasty »

Pheo jaksi nechapem co tym chces povedat. Co by som mal dedit? Dedenie JFrame je pre tvorenie okien samozrejmostou pokial viem a predpokladam, ze dedit hlavnu aplikaciu nema zmysel. Mojim problemom je, ze nestihne uzivatel zadat tie rozmery a aplikacia padne.

//autoeditácia príspevku ( 31 Dec 2009, 11:51 )
pheo napísal: Apropo problemu s tym zastavenim .... aby si dosiahol modalitu (zastavi sa beh v okne pokial sa nevypne dialog) tak sa mrkni na ten jdialog (pouzi namiesto jframe), nejake demo tu

Kód: Vybrať všetko

http://java.sun.com/docs/books/tutorial/uiswing/examples/components/index.html#DialogDemo
No tak toto sa mi pozdava. Dakujem, vyskusam.

//autoeditácia príspevku ( 02 Jan 2010, 12:38 )
Tak uz sa mi to zacalo spravat modalne, ale este stale neviem, ako predat tie udaje z JSpinnerov do druhej triedy.

V tej zakladnej triede mam:

Kód: Vybrať všetko

protected int[] askOnProps() {
		MetaDim que = new MetaDim(inst);
		return que.result;
	}
V druhej triede mam zhruba toto (okresal som to o nezaujimavy balast):

Kód: Vybrať všetko

public class MetaDim {

	private JSpinner width;
	private JSpinner height;

	private JLabel lblX;
	private JLabel lblQ;

	private JButton btOk;
	private JButton btCancel;

	public int[] result;
	public MetaGUI parrentW;

	public MetaDim(MetaGUI parrent) {
		...
		JDialog MD = new JDialog(this.parrentW, title, modal);
		MD.getContentPane().setLayout(new GridBagLayout());

		GridBagConstraints c = new GridBagConstraints();
		...
		MD.add(lblQ, c);

		SpinnerModel Model1 = new SpinnerNumberModel(5, 0, 25, 1);
		SpinnerModel Model2 = new SpinnerNumberModel(5, 0, 25, 1);

		width = new JSpinner(Model1);
		height = new JSpinner(Model2);

		...
		MD.add(width, c);
		...
		MD.add(lblQ, c);
		...
		MD.add(height, c);

		btOk = new JButton("start");
		btOk.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				result[0] = (Integer) width.getValue();
				result[1] = (Integer) height.getValue();
			}
		});

		btOk.setVisible(true);
		...
		MD.add(btOk, c);
		...
		MD.add(btCancel, c);
		
		MD.pack();
		MD.setVisible(true);

	}
}
A pada mi to na null pointer exception v tom btOk ked chcem priradit hodnoty zo spinnerov do pola. Nevedel by si mi poradit ako ich odtial dostat?
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Príspevok od používateľa pheo »

Hm sranda ze som to skoro urobil podla teba a mne to ide

Kód: Vybrať všetko

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;

/**
 *
 * @author pheo
 */
public class Main extends JDialog {

    JLabel lblQ;
    JSpinner width;
    JSpinner height;
    JButton btOk;
    JButton btCancel;
    int[] result = new int[2];

    public Main(Frame owner, String title, boolean modal) {
        super(owner, title, modal);
        getContentPane().setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        lblQ = new JLabel("lbq");

        add(lblQ, c);

        SpinnerModel Model1 = new SpinnerNumberModel(5, 0, 25, 1);
        SpinnerModel Model2 = new SpinnerNumberModel(5, 0, 25, 1);

        width = new JSpinner(Model1);
        height = new JSpinner(Model2);

        add(width, c);

        //dva krát ?
        add(lblQ, c);

        add(height, c);

        btOk = new JButton("start");
        btOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                result[0] = (Integer) width.getValue();
                result[1] = (Integer) height.getValue();
                System.out.println(Arrays.toString(result));
            }
        });

        btOk.setVisible(true);

        add(btOk, c);
        pack();
        setVisible(true);


    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setPreferredSize(new Dimension(400, 400));
        frame.setVisible(true);
        Main main = new Main(frame, "dialog", true);

    }
}

Jasty
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 240
Registrovaný: 13 mar 2008, 19:22

Príspevok od používateľa Jasty »

Ale vsimni si, ze v zozname parametrov je (najma posledne 2 riadky)

Kód: Vybrať všetko

public class MetaDim { 

   private JSpinner width; 
   private JSpinner height; 

   private JLabel lblX; 
   private JLabel lblQ; 

   private JButton btOk; 
   private JButton btCancel; 

   public int[] result; 
   public MetaGUI parrentW;  
Tak ako tento dialog, tak aj ta zakladna trieda reprezentovana parrentW obsahuju pole result. A tam to prave neviem dostat a navyse mi to stale pada :D
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Príspevok od používateľa pheo »

Co tak si dat paretntW ako zavyslost do konstruktora ?

Kód: Vybrať všetko

public class Metadim {
MetaGUI parrentW
       public Metadim(MetaGUI parrentW) {
               this.parrentW = parrentW;
       }
}
INak moc public nepouzivaj lebo sa vystavujes tomu ze niekde zabudnes zavyslosti , java konvencie taketo praktiky odmietaju a tiez je to na hrane OOP
Napísať odpoveď