Programmablauf anhalten bis actionlistener ausgeführt wurde

Status
Nicht offen für weitere Antworten.

TheJavaKid

Top Contributor
hii,

alllllllllso
wenn man ein dialogfeld mit eingabe mittes joptionpane dann wartet der restliche programmcode in der methode ja bis der benutzer im joptionpane einen buton klickt..

ich habe auch sowas ähnliches gemacht:

das ist die separate klasse zu meinem problem:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

//import java.util.*;
//import java.io.*;
//import java.net.*;

// Autor: Mathias Hackl
// Version: 1.0
// Datum: 21.11.2006
public class ParameterManager extends JDialog {
  // Anfang Variablen
  private JPanel buttonPanel = new JPanel(new FlowLayout());
  private JTabbedPane paramTab = new JTabbedPane();
    private JPanel tabPl1 = new JPanel(new BorderLayout());
  private JButton ok = new JButton();
  private JButton cancel = new JButton();
  private String[] header = {"Attribut","Wert"};
  private DefaultTableModel mod1 = new DefaultTableModel(header,0);
  private TableSorter ts = new TableSorter(mod1);
  private JTable mainparams = new JTable(ts);
  private JScrollPane scroll = new JScrollPane(mainparams);
  private int size;
  private Object[][] val;
  // Width=280, Height=360
  // Ende Variablen

  public ParameterManager(JFrame owner, String tag, boolean modal, final String[] params) {
    // Dialog-Initialisierung
    super(owner, "Parameter editieren - "+tag, modal);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    addComponentListener( new ComponentAdapter() {
      public void componentResized( ComponentEvent e ) {
        System.out.println(getSize());
      }
    });
    size=params.length;
    setSize(280, 360);
    ts.addMouseListenerToHeaderInTable(mainparams);
    for(String s : params) {
      mod1.addRow(new Object[]{s,""});
    }
    setLocationRelativeTo(owner);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    // Anfang Komponenten

    paramTab.addTab("Standart-Attribute", tabPl1);
    cp.add(paramTab, BorderLayout.CENTER);
    ok.setText("Einfügen");
    getRootPane().setDefaultButton(ok);
    buttonPanel.add(ok, BorderLayout.WEST);
    ok.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        okActionPerformed(evt);
      }
    });

    cancel.setText("Abbrechen");
    buttonPanel.add(cancel, BorderLayout.EAST);
    cancel.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        cancelActionPerformed(evt);
      }
    });
    cp.add(buttonPanel, BorderLayout.SOUTH);
    mainparams.setDragEnabled(false);
    tabPl1.add(scroll);
    // Ende Komponenten
//    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public void okActionPerformed(ActionEvent evt) {
    val = new String[size][2];
    for(int i=0; i<size; i++) {
      for(int j=0; j<2; j++) {
        val[i][j] = mainparams.getValueAt(i,j);
      }
    }
    dispose();
  }

  public void cancelActionPerformed(ActionEvent evt) {
    dispose();
  }

  public Object[][] getAttributes() {
    return val;
  }

  // Ende Ereignisprozeduren
}


durch einen klick auf erstellen wird ein zweidimensionakes array befüllt und mit einer methode kann es geholt werden.. nun is es aber so das die gesamte methode einfach ausgeführt wird und nicht wartet bis der benutzer "erstellen" geklickt hat und das object[][] array befüllt ist


wie kann ich das am besten anstellen das die methode wartet?


danke
 
G

Gast

Gast
wo ist der erstellen button? oder meinst du den ok/einfügen button?
 
G

Gast

Gast
hmm also in der okActionPerformed Methode wird ein 2-dim Array gefüllt.

und die wird jetzt einfach so ausgeführt ohne das etwas gedrückt wurde? von gottes hand ;)

hmm, mach doch eine boolean variable die abgefragt wird und je nach dem wird dann der rest der methode ausgeführt

und die boolean wird dann in der erstellen methode geändert
 

TheJavaKid

Top Contributor
sooo ich hab den code jetzt umgeändert


Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

import java.util.Arrays;
//import java.io.*;
//import java.net.*;

// Autor: Mathias Hackl
// Version: 1.0
// Datum: 21.11.2006
public class ParameterManager extends JDialog {
  // Anfang Variablen
  private JPanel buttonPanel = new JPanel(new FlowLayout());
  private JTabbedPane paramTab = new JTabbedPane();
    private JPanel tabPl1 = new JPanel(new BorderLayout());
  private JButton ok = new JButton();
  private JButton cancel = new JButton();
  private String[] header = {"Attribut","Wert"};
  private DefaultTableModel mod1 = new DefaultTableModel(header,0);
  private TableSorter ts = new TableSorter(mod1);
  private JTable mainparams = new JTable(ts);
  private JScrollPane scroll = new JScrollPane(mainparams);
  private int size;
  protected Object[][] val=null;
  protected boolean okb = false;
  // Width=280, Height=360
  // Ende Variablen

  public ParameterManager(JFrame owner, String tag, boolean modal, final String[] params) {
    // Dialog-Initialisierung
    super(owner, "Parameter editieren - "+tag, modal);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    size=params.length;
    setSize(280, 360);
    ts.addMouseListenerToHeaderInTable(mainparams);
    for(String s : params) {
      mod1.addRow(new Object[]{s,""});
    }
    setLocationRelativeTo(owner);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    // Anfang Komponenten

    paramTab.addTab("Standart-Attribute", tabPl1);
    cp.add(paramTab, BorderLayout.CENTER);
    ok.setText("Einfügen");
    getRootPane().setDefaultButton(ok);
    buttonPanel.add(ok, BorderLayout.WEST);
    ok.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        okActionPerformed(evt);
      }
    });

    cancel.setText("Abbrechen");
    buttonPanel.add(cancel, BorderLayout.EAST);
    cancel.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        cancelActionPerformed(evt);
      }
    });
    cp.add(buttonPanel, BorderLayout.SOUTH);
    mainparams.setDragEnabled(false);
    tabPl1.add(scroll);
    // Ende Komponenten
//    setResizable(false);
    setVisible(true);
  }

  public Object[][] setValues() {
    Object[][] val1 = new Object[size][2];
    for(int i=0; i<size; i++) {
      for(int j=0; j<2; j++) {
        val1[i][j] = mainparams.getValueAt(i,j);
      }
    }
    return val1;
  }

  // Anfang Ereignisprozeduren
  public void okActionPerformed(ActionEvent evt) {
    this.val = setValues();
    this.okb=true;
    dispose();
  }

  public void cancelActionPerformed(ActionEvent evt) {
    dispose();
  }

  public Object[][] getAttributes() {
    return val;
  }

  // Ende Ereignisprozeduren
}

und in meiner hauptklasse hba ich jetzt folgendes:

Code:
  public void getAtts(String tag, String[] tags){
    pmm=new ParameterManager(this, tag, false,tags);
  }

und in einem actionlistener soll das ganze jetzt benutzt werden:

Code:
HTMLJMenuItem2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        getAtts("HTML - Body", new String[]{"bgcolor","text"});
        System.out.println("BOOL: "+pmm.okb);
        if(pmm.okb)
          insertTag("<html>\n\t<head>\n\t\t<title>Unbenanntes Dokument</title>\n\t</head>\n\t<body "+pmm.val[0][0]+"="+pmm.val[0][1]+">\n\t\t\n\t</body>\n</html>",17);
        System.out.println("BOOL: "+pmm.okb);
      }
    });

es soll per klick auf das JMenuItem das Fenster des ParameterManagers aufgehn und dann ... wenn man auf einfügen klickt soll eine boolean im parametermanager auf true gesetzt werden...und sobald die rue is soll im JMenuItem die Methode
Code:
insertTag("<html>\n\t<head>\n\t\t<title>Unbenanntes Dokument</title>\n\t</head>\n\t<body "+pmm.val[0][0]+"="+pmm.val[0][1]+">\n\t\t\n\t</body>\n</html>",17);
aufgerufen werden und dabei werden die daten des zweidimensionalen object ausgelesen und benutzt


aber es eght nicht... wiesoo???? HILFEE..............
 
S

SlaterB

Gast
ich frage mich immer was es nur für einen Sinn macht so komplizierte Fragen zu stellen,
meinst du dein Problem hat was damit zu tun ob du irgendwo
'<html>\n\t<head>\n\t\t<title>' oder doch eher 'Anna fährt nach München' einfügst?
wenn das nicht zum Problem beiträgt, warum postest du das dann?
warum?

dein ganzen Code ist total sinnlos, verwirrt nur und kann nicht mal getestet werden, da die Hälfte fehlt,

ein ganz simples Testprogramm ist folgendes:

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class TestGUI extends JFrame {

	JButton b = new JButton("test");

	public TestGUI() throws Exception {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().add(b);
		
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("Hello");
				new JDialog(TestGUI.this, true).setVisible(true);
				System.out.println("Hello2");
			}

		});
		setSize(150, 100);
		setVisible(true);
	}

	public static void main(String[] args) throws Exception {
		new TestGUI();
	}
}

so und was kann nun ein JDialog? interessanterweise kann er blockieren, in etwa so wie du es willst,

also wenn man modal=true als Parameter einfügt, dann wird 'Hallo2' erst dann geschrieben, wenn der JDialog geschlossen wird,
alles andere muss warten,

andererseits kann man auch modal=false im Konstruktor angeben,
dann passiert das was man normalerweise erwartet, ein Programm läuft ganz normal weiter,
da stellt sich mir jetzt die Frage, warum du in deinem Programm nicht einfach modal=true aufrufst?!

-----------

ansonsten:
der Befehl direkt nach dem Erzeugen des Dialogs wird entsprechend bereits wenige Miilisekunden nach dessen Erzeugung oder Anzeige ausgeführt,
so schnell kann ja niemand auf den OK-Button drücken,

wieso also führst du also diesen Test 'if(pmm.okb) ' direkt danach aus?
weil du dich darauf verläßt, das der JDialog solange wartet?
dann musst du ihn richtig bedienen, also true im Konstruktor angeben,

ansonsten musst du doch die vielen Sekunden überbrücken,
da gehört dann ein Thread hin mit einer Endlosschleife, der alle 0.2 Sekunden nachschaut, ob der Dialog fertig ist,

eine schlaue andere Möglichkeit: die nachfolgende Aktion erst beim Drücken des Ok-Buttons im JDialog starten,
wenn der zugehörige Code nicht im Dialog stehen soll,
dann gehört da eben ein notifyCaller()-Aufruf oder ähnliches hin
 

TheJavaKid

Top Contributor
dieser blöde billigsdorfer javaeditor -.-" schreibt immer modal = false... naja.. da mein code leider schon sehr lang is hab ich das wohl mal wieder übersehen..

danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
stylegangsta Programmablauf von vorne beginnen und manuell beenden Allgemeine Java-Themen 9
O Nach parse von String zu Integer verliere ich Programmablauf! Allgemeine Java-Themen 10
M Programmablauf nach letzter eingabe erst fortsetzten Allgemeine Java-Themen 2
F Vorgehen bei automatischen Programmablauf Allgemeine Java-Themen 2
x46 Threads Threads anhalten Allgemeine Java-Themen 1
B APi methode kurz anhalten Allgemeine Java-Themen 8
S Listeners anhalten Allgemeine Java-Themen 6
S Thread anhalten per Button ? Allgemeine Java-Themen 3
C Ablauf des Programms anhalten, bis.... Allgemeine Java-Themen 5
S Thread anhalten Allgemeine Java-Themen 7
brunothg ThreadPoolExecutor anhalten Allgemeine Java-Themen 4
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
A programm anhalten aber wie? Allgemeine Java-Themen 4
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5
A Einen Thread von einem anderen aus anhalten? Allgemeine Java-Themen 11
M Thread mit wait anhalten, wie weiterlaufenlassen? Allgemeine Java-Themen 3
S Programm kurz anhalten Allgemeine Java-Themen 3
F JButton und ActionListener Allgemeine Java-Themen 3
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
V Event Handling ActionListener nur bei "checked" CheckBoxMenuItem Allgemeine Java-Themen 2
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
C ActionListener - ToggleButton als von KI geklickt "markieren" Allgemeine Java-Themen 2
A ActionListener blockiert Bedienung des ganzen Systems Allgemeine Java-Themen 8
Z Swing Problem mit ActionListener Allgemeine Java-Themen 6
X getText undefiniert in ActionListener Allgemeine Java-Themen 5
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
C Event Handling ActionListener manuell auslösen Allgemeine Java-Themen 8
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
T ActionListener und Singleton Allgemeine Java-Themen 15
J ActionListener-Klasse will Methode nicht annehmen Allgemeine Java-Themen 6
G Übergabeparameter an ActionListener Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
W 2 Klassen + ActionListener Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
C ActionListener reagiert zu oft Allgemeine Java-Themen 5
MQue ActionListener und GUI trennen Allgemeine Java-Themen 3
L ActionListener / Buttons Allgemeine Java-Themen 8
E ActionListener Allgemeine Java-Themen 8
minzel ActionListener aus Package Allgemeine Java-Themen 24
F AbstractAction und ActionListener Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
K ActionListener ohne implements? Allgemeine Java-Themen 2
L ActionListener > Variable ... u.v.m. Allgemeine Java-Themen 19
W ActionListener + Klasse einbinden Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben