# Beim ausführen bleibt der Button gedrückt .



## LeXor (21. Feb 2007)

Hallo ich habe leider ein Problem. 

Ich sitzte schon seit einer weile und versuche das Problem zu lösen. Leider klappt es nicht.

Also: Ich möchte etwas ausführen, wenn der Button gedrückt wird (mit allem Drum und Dran. Schleifen, Datei öffnen, speichern ). Nun wenn ich das mache kann ich mein Programm nicht beenden oder eine andere Button drücken, da es noch im Hintergrund ausgeführt wird. 

Ich arbeite mit Netbeans und habe schon als event MousePressed oder Action ... genommen. Leider mit dem selben erfolg.


----------



## The_S (21. Feb 2007)

Stichwörter:

Threads und SwingUtilities#invokeLater


----------



## Wildcard (21. Feb 2007)

Du musst arbeitsintensive Methoden in einem seperaten Thread ausführen da du sonst den AWT-Event-Dispatcher-Thread blockierst.


----------



## LeXor (21. Feb 2007)

Danke das funktioniert mit Threads. 

Eine andere Frage: wenn ich auf Events gehe und KeyPressed oder KeyTyped wähle und diese nicht mehr verwende. Wie kann ich diese wieder löschen, denn Netbeans erlaubt mir das nicht. Ich kann den Quelltext nicht löschen.


----------



## Wildcard (21. Feb 2007)

Mein Vorschlag ist: die miesen GUI-Builder in die Ecke verbannen  :bae:


----------



## LeXor (21. Feb 2007)

Naja ich habe mit Eclipse angefangen aber leider kann man dort nicht so schnell die Grafische Oberfläche bauen. Deshalb bin ich bei diesem Projekt auf NetBeans umgestiegen. Nur möchte ich nicht wieder ein Projekt eröffnenen und dann alles kopieren. Denn das muss doch irgendwie anders gehen. 

Denn einmal vertippt und die Zeile bleibt stehen.


----------



## The_S (21. Feb 2007)

kA wie das Netbeans macht, aber ich halte von GUI-Buildern auch net viel. Lieber alles per Hand reinhacken  !


----------



## Wildcard (21. Feb 2007)

Die Dinger haben schon ihre Berechtigung, die liegt aber mehr bei Präsentationen und Demos als produktiv-Code.


----------



## LeXor (21. Feb 2007)

Naja leider zu früh gefreuet. Ich habe immer noch Probleme mit Threads.

Mein Code der Ausgeführt werden soll, wenn ein Button gedrückt wird. Leider bekomme ich hier das Problem das zum Beispiel bei "countFeedback.setText("Unendlich");" nicht dargestellt wird. Der Quelltext wird ausgeführt leider greift er nicht auf die Haupt Klasse.

```
class Bewertungen extends MainKlasse implements Runnable {
    
    public void run() {
        
        String anzahlBewertungen;
        int feedback = 1;
        String bewInter =   bewertungsIntervall.getText();    // <-- wird nicht aus geführt
        
        if( bewertungenUnendlich.isSelected() ) {
            feedback   =   1000000;
            countFeedback.setText("unendlich");                    // <-- kann nicht dargestellt werden
        }
        ...
```

Hauptklasse

```
public class MainKlasse extends javax.swing.JFrame {

    ...
    private void butStartMouseReleased(java.awt.event.MouseEvent evt) {

        Thread th   =   new Thread( new Bewertungen() );
        th.start();
        butStart.setEnabled( false );
    }
    ...
}
```
Leider wie schon oben beschrieben, kann die Nebenklasse "Bewertungen" nicht auf die JLabel von Hauptklasse zugreifen. der JLabel habe ich schon auf public gesetzt.


----------



## Wildcard (21. Feb 2007)

Was soll denn bitte 'wird nicht ausgeführt' bedeuten?
Die Informationen reichnen nicht um den Fehler zu finden.


----------



## Guest (21. Feb 2007)

Also Fehler gibt es keine das ist das Problem, sonst hätte ich da nach der Lösung gesucht. Aber ich komme so nicht weiter. 

z.B. hier:

```
if( bewertungenUnendlich.isSelected() == true ) { 

    countFeedback.setText("unendlich");      // hier muss doch die Zeile geändert werden, leider klappt es nicht
}
```


----------



## Wildcard (21. Feb 2007)

Debugger benutzen oder mehr Code posten.


----------



## Gast (22. Feb 2007)

wird vllt. versucht die gui nach dem Drücken neu zu zeichnen und dabei nicht neu gezeichnet?


----------



## LeXor (22. Feb 2007)

OK hier mein Code


```
package javaapplication1;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

class Bewertungen extends MainKlasse implements Runnable {
    
    public void run() {
        
        if( bewertungenUnendlich.isSelected() == true ) {
            
            MainKlasse.countFeedback.setText("unendlich");
        }
        ...
    }
}


public class MainKlasse extends javax.swing.JFrame {

    public MainKlasse() {
        initComponents();
    }

    private void initComponents() {
        countFeedback = new javax.swing.JLabel();
        ...
    }

    private void butStartMouseReleased(java.awt.event.MouseEvent evt) {                                       

        Thread th   =   new Thread( new Bewertungen() );
        th.start();
    }  

    public static void main( String args[] ) throws Exception {
                              
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainKlasse().setVisible( true );
            }
        });
    }

    public static javax.swing.JLabel countFeedback;
}
```


----------



## André Uhres (23. Feb 2007)

```
package javaapplication1;
/*
 * MainKlasse.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainKlasse extends JFrame {
    private JButton butStart;
    protected JLabel countFeedback;
    protected JTextField bewertungsIntervall;
    protected JCheckBox bewertungenUnendlich;
    protected JLabel lb = new JLabel("   \"Bewertungen\" läuft");
    public MainKlasse() {
        super("MainKlasse");
        initComponents();
    }
    private void initComponents() {
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        countFeedback = new JLabel();
        butStart = new JButton("Start");
        bewertungsIntervall = new JTextField("123", 10);
        bewertungenUnendlich = new JCheckBox("bewertungenUnendlich", true);
        countFeedback.setPreferredSize(new Dimension(300,20));
        setLayout(new FlowLayout());
        add(butStart);
        add(bewertungsIntervall);
        add(bewertungenUnendlich);
        add(countFeedback);
        //mit glasspane kannst du Sachen über dem Frame anzeigen,
        //während dein Thread "Bewertungen" läuft 
        // z.B. eine Sanduhr und eventuell noch ein Text:
        JComponent glasspane = (JComponent) getGlassPane();
        glasspane.setLayout(new BorderLayout());
        glasspane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        lb.setForeground(Color.RED);
        glasspane.add(lb, BorderLayout.SOUTH);
        //Ein JButton bekommt gewöhnlich einen "ActionListener" statt "MouseListener":
        butStart.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                butStartActionPerformed(e);
            }
        });
    }
    private void butStartActionPerformed(final ActionEvent evt) {
        Thread th   =   new Thread( new Bewertungen(this) );
        th.start();
    }
    public static void main( final String args[] ) throws Exception {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainKlasse().setVisible( true );
            }
        });
    }
}
//Wenn du "Bewertungen" von "MainKlasse" ableitest,
//dann werden bei einer Neuerzeugung von "Bewertungen"
//die Variablen von "MainKlasse" auch neu erzeugt
//und entsprechen deshalb nicht mehr den Variablen der urspünglichen "MainKlasse".
//Die folgende Lösung übergibt daher einfach die Referenz der urspünglichen "MainKlasse":
class Bewertungen implements Runnable {//<----- nicht von MainKlasse ableiten
    private MainKlasse mainClass;
    private int feedback;
    private String anzahlBewertungen;
    private String bewInter;
    public Bewertungen(final MainKlasse mainClass){//<--------------------- HIER
        this.mainClass = mainClass;
    }
    public void run() {
        /* "SwingUtilities.invokeLater" sollte benutzt werden
         *  wenn eine Anwendung die GUI verändern muss:
         */
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                mainClass.getGlassPane().setVisible(true);//Sanduhr anzeigen
                mainClass.countFeedback.setText("");
            }
        });
        try {Thread.sleep(3000);} catch (InterruptedException ex) {}//simuliert Bearbeitungszeit
        anzahlBewertungen = "";
        feedback = 1;
        bewInter = mainClass.bewertungsIntervall.getText();
        if( mainClass.bewertungenUnendlich.isSelected() ) {
            feedback = 1000000;
        }
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                mainClass.countFeedback.setText("bewInter: '"+bewInter+"'  feedback: '"+feedback+"'");
                mainClass.getGlassPane().setVisible(false);//Sanduhr wieder verstecken
            }
        });
    }
}
```


----------



## LeXor (24. Feb 2007)

Danke für deinen Quellcode.

Soweit funktioniert das auch. Aber leider habe ich auch noch eine while Schleife. Wenn diese while schleife in der Bewertung Klasse ausgeführt wird. Wird der Text "unendlich" nicht angezeigt und mein Programm reagiert dann auch nicht mehr, d.h. alle Buttons sind wie am Anfang nicht drückbar. Ich kann das Programm nicht schließen.


----------



## LeXor (24. Feb 2007)

Vielen Dank habe es selber rausgefunden


----------



## André Uhres (24. Feb 2007)

LeXor hat gesagt.:
			
		

> Vielen Dank habe es selber rausgefunden


----------



## masta // thomas (24. Feb 2007)

[ ist als Gast nur etwas schwierig?  ]


----------



## licht (1. Mrz 2007)

Hallo, ein kleines Problem!
Ich möchte , wenn ich auf einen Button drücke , dass ein Ereignis passiert.
Eigentlich kein Problem!
Aber , wenn ich drauf drücke, passiert nichts!Es kommt auch keine Fehlermeldung.



```
public void actionPerformed(ActionEvent evt) 
    { 
   if (cmd.equals(" Suchen ")) 
      {   
      String inhalt = t.getText();
      if (inhalt.length() == 0)  
        {
        System.out.println("es steht nichts drine");    
        } 
        else 
        {     
        System.out.println("es steht was drine");
        }
     }
```

Mein Button ist so definiert!

 Button s = new Button (" Suchen ");
        s.setBounds(200,50,50,25);
        s.setForeground(Color.BLUE);
        s.setBackground(Color.WHITE);
        s.addActionListener(this);
        this.panel.add(s);

Mein Textfeld:

TextField t = new TextField();
        t.setBounds(200,30,200,20);
        t.addActionListener(this);
        this.panel.add(t);


danke für die hilfe schon mal![/code]


----------



## André Uhres (1. Mrz 2007)

if (evt.getActionCommand().equals(" Suchen "))


----------



## Guest (1. Mrz 2007)

danke, das hab ich auch schon versucht...
das funktioniert auch nicht!
der button an sich funktioniert, aber nich die kontrolle des textfelds glaube!
denoch danke!


----------



## licht (1. Mrz 2007)

denoch wäre eine hilf antwort mir noch lieb !


----------



## Marco13 (1. Mrz 2007)

Eigentlich ist der Thread ja schon abge"harkt" - evtl. einen neuen aufmachen. Lohnt sich aber vielleicht nicht. Gib einfach mal ein paar Infos aus:

```
public void actionPerformed(ActionEvent e)
{
    String suche = " Suche ";
    System.out.println("Erwarte: '"+suche+"'");    
    System.out.println("Habe: '"+e.getActionCommand()+"'");
    System.out.println("Ist es das? "+e.getActionCommand().equals(suche));
    ...
}
```


----------



## André Uhres (1. Mrz 2007)

```
...
public class NewFrame extends java.awt.Frame implements ActionListener{
...
    private TextField t = new TextField();//<--------------------------
    public NewFrame() {
...
//        Mein Textfeld:
        t = new TextField();//<--------------------------------
...
    }
...   
}
```
Du musst das Textfeld nur *einmal* deklarieren als Klassenvariable.
Und nicht noch einmal lokal.


----------



## licht (2. Mrz 2007)

mhh na ich geb mal mehr code, da ich es grad nicht kapier!
es ist halt eine art Menu..so und wenn ich halt auf den Button Suchen drücke, soll der was machen, macht er aber nicht!
So, eine Methoden habe ich rausgenommen, damit es nicht so voll wird und nur das wesentliche da steht!

Ach, wollts nur erwähnt haben, ich versuch mir Java gerade anzueignen. Also wegen Formfehler gerne drauf hinweisen, aber nicht böse sein ;-)!


```
public class Main extends JFrame implements ActionListener, WindowListener 
{ 
    JEditorPane pane;  
    JPanel panel;
    TextField t;
    Button s,d;

     public void setVisible(boolean b) {
    }
    public static void main(String args[] ) 
    { 
        Main Fenster1 = new Main(); 
        Fenster1.setSize(500, 300); 
        Fenster1.setLocation(250, 200); 
        Fenster1.setTitle("<<<<Hilfe Menü>>>>");       
        Fenster1.setResizable(false);
        
        Fenster1.show(); 
  
    }
        // JLabel l = new JLabel("Standard-Label"); 
    
  public Main() 
    { 
     Calendar cal = Calendar.getInstance();
        SimpleDateFormat formater = new SimpleDateFormat();
        
        MenuBar hauptMenue = new MenuBar(); 
        Menu menue1 = new Menu("Einführung"); 
       //Menu...
       // .
       // .
        
        hauptMenue.add(menue1); 
        hauptMenue.add(menue2); 
        hauptMenue.add(menue3); 
        hauptMenue.setHelpMenu(menue4); 
        hauptMenue.add(menue5); 
        
      
        
        setMenuBar(hauptMenue); 
        
        
        menue1.addActionListener(this);
        menue2.addActionListener(this);
        menue3.addActionListener(this);
        menue4.addActionListener(this);
        menue5.addActionListener(this);
       
        
        addWindowListener(this); 
        
       
        
        this.pane = new JEditorPane("text/html","<html><body><head></head>
<center>" +
                                    "[img]H:/java/üben/logo.jpg[/img]" +
                                    "
<font face='Arial' size='22' Color='green'>SIMCOAT Hilfe</font>
" +
                                    "

Version: 0.1</center>


</body></html>");
        this.pane.setVisible(true);
        getContentPane().add(pane); //Logo anzeigen
        
        this.panel = new JPanel();
        this.panel.setVisible(false);
        getContentPane().add(panel);
        
        JScrollPane scrollPane = new JScrollPane(pane);
        add(scrollPane, BorderLayout.CENTER);

  }
  
    public void actionPerformed(ActionEvent evt)// von hier bis unten zu dem strich funktioniert was nicht-------------
    { 
     
     if (evt.getActionCommand().equals(" Löschen "))      
     {
      t.setText(" ");
     }
     
     else if (evt.getActionCommand().equals(" Suchen ")) 
      {   
      String inhalt = t.getText();
      if (inhalt.length() == 0)  
        {
        /*Frame dia = new Frame();
        dia.setSize(200,100);
        dia.setLocation(200,150);
        dia.setTitle("Meldung");       
        dia.show();*/
        System.out.println("es steht nichts drine");    
       }
        else
        {     
        System.out.println("es steht was drine");
        }
       }//----------------------------------------------------------------------------------------------------------------
      //suchen();
      
      
       if (evt.getSource() instanceof MenuItem) 
         { 
         String menuAdd = evt.getActionCommand();
         System.out.println(menuAdd);
         
           if (menuAdd == "beenden")
             {
             System.exit(0);
             }//----------------------------------------------------------------
         
           //Einlesen Html-Seiten 
           else if(menuAdd.equals("Bauteilverarbeitung"))
             {
              bauteilverarbeitung();
             }//----------------------------------------------------------------
         
           //nächste Seite
           else if(menuAdd.equals("Menü einstellung"))
             {
              einstellung();  
              }//---------------------------------------------------------------
         
           //nächste Seite
           else if(menuAdd.equals("Menü Ergebnisdarstellung"))
             {
              ergebnissdarstellung();
             }//----------------------------------------------------------------
         
           //nächste Seite
           else if(menuAdd.equals("Vorraussetzungen"))
             {
              vorraussetzung();
             }//----------------------------------------------------------------
         
           //nächste Seite
           else if(menuAdd.equals("Installation Java"))
             {
              installation();
             }//----------------------------------------------------------------
         
            //nächste Seite
           else if(menuAdd.equals("Installation Java 3D"))
             {
             javaD();
             }//----------------------------------------------------------------
         
           else if(menuAdd.equals("Einführung"))
             {
              einfuhrung();
             }//----------------------------------------------------------------
         
           //<<<<<<Suchformular
           else if(menuAdd.equals("Suchen"))
             {   
              suchenformular();
             }//----------------------------------------------------------------
       
           else
            {
             String htmlContent = "<html><body>" + menuAdd + "<body></html>";
             //this.text.setText(htmlContent);
             this.pane.setText(htmlContent);
            }
         
        }
}

    
 
    public void windowClosing(WindowEvent evt) 
    { 
        System.exit(0); 
    } 

    public void windowOpened(WindowEvent evt){} 
    public void windowIconified(WindowEvent evt){} 
    public void windowDeiconified(WindowEvent evt){} 
    public void windowClosed(WindowEvent evt){} 
    public void windowActivated(WindowEvent evt){} 
    public void windowDeactivated(WindowEvent evt){} 


    private void suchenformular() {
        panel.setLayout(null);
        this.pane.setVisible(false);
        this.panel.setVisible(true);
       
        Button s = new Button (" Suchen ");
        s.setBounds(200,50,50,25);
        s.setForeground(Color.BLUE);
        s.setBackground(Color.WHITE);
       // s.addActionListener(this);
        this.panel.add(s);
        
        Button d = new Button (" Löschen ");
        d.setBounds(250,50,50,25);
        d.setForeground(Color.ORANGE);
        d.setBackground(Color.WHITE);
        d.addActionListener(this);
        this.panel.add(d);
       
        Label l = new Label ("Search Word: ");
        l.setBounds(100,30,100,15);
        this.panel.add(l);
        
        TextField t = new TextField();
        t.setBounds(200,30,200,20);
        t.addActionListener(this);
     
        this.panel.add(t);
     
    }
         

}
```


----------



## André Uhres (2. Mrz 2007)

```
private void suchenformular() {
..
        t = new TextField();//<-----------------------
...
    }
```
Man sollte es auch vermeiden, AWT und Swing zu mischen.


----------



## Gast (2. Mrz 2007)

kannst mir da mal ein tip geben, welches ich am besten änder?bitte!


----------



## André Uhres (2. Mrz 2007)

Alle sichtbaren Komponenten die kein J vorne haben würde ich mit J schreiben (->Swing). 
Also Menubar->JMenuBar (dann natürlich auch set*J*MenuBar) , Menu->JMenu, 
TextField->JTextField, Button->JButton, Label->JLabel, ...
Außerdem, "show" ist deprecated: show()->setVisible(true)
EDIT: "panel" sollte auch nicht ins ContentPane solange "pane" noch drin drin ist.


----------



## Gast (2. Mrz 2007)

ja habe ich geändert, dann kommt aber ein Fehler.. java.lang.error setHelpMenu() not yet implented..

da wollt ich das mit exception abfangen...

try
        {
        hauptMenue.setHelpMenu(menue4); 
        }
        catch (Exception e){
        }

in ordnung oder nicht?


----------



## André Uhres (2. Mrz 2007)

Gast hat gesagt.:
			
		

> ja habe ich geändert, dann kommt aber ein Fehler.. java.lang.error setHelpMenu() not yet implented...


Dann gibt's das wohl nicht in Swing. Du musst dann entweder das Menü wieder auf AWT setzen,
(siehe dazu auch : http://www.java-forum.org/de/viewtopic.php?p=243880#243880 , 
oder es irgendwie anders machen, also mit den Mitteln die Swing zur Verfügung hat.


----------



## Gast (2. Mrz 2007)

das verwirrt mich ja total..ich brauch aber swing..z.b. für mein JEditorPane..mhh komisch, möchte das hinbekomme!

dein link ist super, aber da müsste ich dies einmal halt gesehen haben richtig, um das nachzu vollziehen, wie ich es mische oder wie ich jetz nur awt komponenten nutze..

danke!


----------



## Gast (5. Mrz 2007)

warum möcht mir keiner so richtig helfen??
ich habs versucht zu ändern, geht aber nicht, ihr könnt euch ja mal mein quelltext anschaun und ändern und mir erklären!
wäre lieb von euch !


----------



## André Uhres (5. Mrz 2007)

Gast hat gesagt.:
			
		

> warum möcht mir keiner so richtig helfen??..


Sry, dein letzter Beitrag klang für mich so, als ob du dich selbst durchschlagen wolltest.
Ich glaube dein Code ist eh nur ein Fragment? Könntest du den kompletten Code irgendwo hochladen?
(Das kannst du übirgens auch hier im Forum über "Eigene Dateien" hochladen: du brauchst dich nur  einzuloggen)


----------



## Guest (5. Mrz 2007)

)den einen Post in dem anderen Thread darfst gerne löschen)

danke, habe mich auch schon selber durchgeschlagen..
ein neues Probelm ..

habe ein Array
und die soll etwas durchsuchen..
--habe ich hin bekommen..


so, ich möchte aber gerne noch weitere html durchsuchen, da muss ich mir ja weitere Indexes anlegen, aber wie durchsuch ich dann alle?




```
String url[]     = {"einfuhrung.html"};
 String in[]  = {"Programmsystem", "SimCoat", "Simulation", "Quellcode"};
 String ueberschrift[] ={"Einführung"};
    
//Wie mache ich das, dass der mir den Inhalt auch hier durchsucht?
//und bei der Ausgabe le2,le3,le4 das ganze dann dynamisch ist?!
        
 /* String url[]   = {"bauteilvearbeitung.html"};
     String inhalt[]  = {"Seite 1"};*/
            
             String suchwort= t.getText();
          
             for (int i=0; i<in.length; i++)
              {
               if (in[i].equals(suchwort))
                { 
                System.out.println("suchwort ok");
                le.setVisible(true);
                le2.setVisible(true);
                le3.setVisible(true);
                le4.setVisible(true);
                
                le2.setText("Suchwort         : " + suchwort);
                le3.setText("Wo zu finden     : " + ueberschrift[0]);
                le4.setText("Dazugehörende URL: " + url[0]);
                }
}
```


----------



## André Uhres (7. Mrz 2007)

Du könntest dir eine Liste der Indexes machen. Dazu ist es wohl besser, eine Klasse "Index" machen, die alle Indexinfos enthält.


----------

