Avatar billede jeppejensen Nybegynder
22. december 2004 - 09:05 Der er 19 kommentarer og
1 løsning

Ikke modal jdialog viser ikke komponenter

Jeg vil gerne lave min egen progressbar, dog bare en jdialog med en tekst, man skal så kunne kalde jdialogen men en setText(String txt), der skal ændre teksten, men kommer slet ikke så langt. Hvis jeg sætter dialogen modalt så køre koden selvfølgelig ikke videre, hvis jeg IKKE gør kommer min jlabel ikke frem på jdialogen.

Jeg vil gerne kalde den således
myProgressbar myProgressbar = new myProgressbar();
myProgressbar.setVisible(true);

for (int i=0;i<a;i++) {
>køre noget kode<
myProgressbar.setText("Doing " + i + " af " + a)
}
myProgressbar.dispose();


Venlig Hilsen
Jeppe
Avatar billede soreno Praktikant
22. december 2004 - 09:44 #1
Prøv noget ala dette:
myProgressbar.setText("Doing " + i + " af " + a)
myProgressbar.repaint();

(forudsætter at myProgressbar arver fra et eller andet relevant swing)
Avatar billede jeppejensen Nybegynder
22. december 2004 - 10:01 #2
No go, der er først når den er færdig med loopet at den skriver den sidste tekst på jdialogen, myProgressbar arver fra JDialog, og den har kun en metode, setTest(String txt). Men som sagt er dialogen stadig tom.

Andre ideér er meget velkommen.

Venlig Hilsen
Jeppe
Avatar billede soreno Praktikant
22. december 2004 - 10:10 #3
Må man se din myProgressbar klasse (jeg forstår nemlig ikke dit argument) ?
Avatar billede jeppejensen Nybegynder
22. december 2004 - 10:28 #4
Ja da, men det virker fint hvis jeg kalder den med myProgressbar.setModal(true), men så køre koden hvor den bliver kaldet fra ikke videre.:

import java.awt.Dimension;
import javax.swing.JDialog;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JLabel;

public class MyProgressbar extends JDialog  {
    private BorderLayout borderLayout1 = new BorderLayout();
    private GridBagLayout gridBagLayout1 = new GridBagLayout();
    private JPanel jPanel1 = new JPanel();
    private JLabel jLabel1 = new JLabel("TEST 123");

    public MyProgressbar() {       
        try {
            jbInit();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        this.setSize(new Dimension(400, 300));       
        this.getContentPane().setLayout(borderLayout1);
        jPanel1.setLayout(gridBagLayout1);       
        jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
       
        this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    }

    public void setText(String txt) {
        System.out.println("text set: " + txt);
        jLabel1.setText(txt);
    }
}
Avatar billede soreno Praktikant
22. december 2004 - 10:55 #5
Hvad gør " >køre noget kode<" ?

Jeg har nemlig ikke problemer med din bar med følgende kode(a og b er afpasset mit system for at simulere en beregning):
    MyProgressbar bar = new MyProgressbar();
    bar.setVisible(true);
    int foo;
    for(int i=0;i<30;i++)
    {
        for(int a=0;a<2000000;a++)
        for(int b=0;b<20;b++)
        {
            foo = a+b;
        }
        bar.setText("Doing item: " + i);
    }
    bar.dispose();
Avatar billede jeppejensen Nybegynder
22. december 2004 - 11:12 #6
Du får bare lige hele metoden, det den skal gøre er at lave nogle pdf filer og derefter printe dem. før lavede jeg progressbaren inde i denne metode, da det ikke virkede prøvede jeg at parametere overføre den.

Der er brugt egne klasser så du vil ikke kunne køre den uden lidt modifikation, men nu får du den "råt for usødet"

    public static void printReports(final ApplicationModule am, final String[] report, final JPanel panel, MyProgressbar progressbar) {       
               
        String localFilename;
        int tmp;
        String[] deleteArray = new String[report.length];
        if (System.getProperty("java.io.tmpdir") == null) {
            ValidationErrorHandler.handleError(new UtilException("Util-5075", "Error"), panel);
        } else {       
            try {
                //The URL of the reportsserver to use is fetched in the table ENV_PARAMETERS
                ViewObject envParamView = am.createViewObjectFromQueryStmt("EnvParamView", "select EnvParameters.VALUE as Value from SYSMODULE.ENV_PARAMETERS EnvParameters where EnvParameters.ENV_PARAMETER_NAME = 'REPORTS_SERVER'");
                Row envParam = envParamView.first();
                String repServer = envParam.getAttribute("VALUE").toString();       
                System.out.println("Antal i []: " + report.length);               
                for (int i=0; report.length > i; i++) {
                    System.out.println("Creating file " + (i+1) + " of " + report.length);
                    progressbar.setText("Creating file " + (i+1) + " of " + report.length);
                    progressbar.repaint();
                    //Putting the file in the users temp dir.
                    localFilename = System.getProperty("java.io.tmpdir") + "\\" + "temp" + System.currentTimeMillis() + ".pdf";
                    URL invoke = new URL(repServer + report[i]);
                    FileOutputStream output = new FileOutputStream(localFilename);
                    InputStream input = invoke.openStream();
               
                    tmp = 0;
                    while (tmp != -1) {
                      tmp = input.read();
                      output.write(tmp);
                    }

                    input.close();
                    output.close();
               
                    deleteArray[i] = localFilename;                   
                }
                System.out.println("Printing");
                for (int i=0;deleteArray.length > i;i++) {                   
                    //Runtime.getRuntime().exec("repPrint " + deleteArray[i]);
                }
                envParamView.remove();
                progressbar.dispose();
                System.out.println("disposing");
            } catch (IOException ex) {
                FailureErrorHandler.handleError(ex, new JPanel());
            }
            for (int i=0;deleteArray.length > i;i++) {
            //Deleting the files, not done, because
            //they are deleted before they are printed
    //            boolean val = new File(deleteArray[i]).delete();
            }
        }   
    }

Venlig Hilsen
Jeppe
Avatar billede soreno Praktikant
22. december 2004 - 11:16 #7
Bliver disse:
for (int i=0; report.length > i; i++) {
  System.out.println("Creating file " + (i+1) + " of " + report.length);

Printet i konsollen ?
Avatar billede jeppejensen Nybegynder
22. december 2004 - 11:26 #8
Ja, og den i progressbaren udskriver også:

her er konsollen printout

Antal i []: 3
Creating file 1 of 3
text set: Creating file 1 of 3
Creating file 2 of 3
text set: Creating file 2 of 3
Creating file 3 of 3
text set: Creating file 3 of 3
Printing
disposing
Tid at udskrive 3 Ordre: 82359

Venlig Hilsen
Jeppe
Avatar billede mikkelbm Nybegynder
22. december 2004 - 12:27 #9
Hvis du har noget gui der skal opdateres i takt med at noget andet kode afvikles, er det en god idé at afvikle det andet kode i en ny tråd. Ellers vil du løbe ind i det problem, at gui'en først opdaterer når koden er færdigkørt.
Avatar billede mikkelbm Nybegynder
22. december 2004 - 12:29 #10
Så det bliver noget a la:

ProgressBar bar = new ProgressBar();

new Thread()
{
  // afvikel din kode...
  // opdatér progressbar - bar.setString ("bla bla");
}.start();


På den måde låser du ikke gui'en.
Avatar billede mikkelbm Nybegynder
22. december 2004 - 12:36 #11
Et lille hurtigt eksempel på noget der ikke virker:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame
{   
    private JLabel fakeBar = new JLabel();
    private JButton start = new JButton("Kør");

    public Test() throws Exception
    {
        this.setSize(300, 100);
        this.getContentPane().add(fakeBar, BorderLayout.CENTER);
        this.getContentPane().add(start, BorderLayout.SOUTH);
       
        start.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                start();   
            }
        });
    }
   
    public void start()
    {
        for (int i = 0; i<20; i++)
        {
            fakeBar.setText("Test " + i);
            try
            {
                Thread.sleep(300);
            }catch (Exception ex) {}
        }
    }
   
    public static void main(String[] args) throws Exception
    {       
        new Test().setVisible(true);
    }
}
Avatar billede mikkelbm Nybegynder
22. december 2004 - 12:37 #12
Men hvis start() metoden laves om til:

public void start()
{
    new Thread()
    {
        public void run()
        {
            for (int i = 0; i<20; i++)
            {
                fakeBar.setText("Test " + i);
                try
                {
                    Thread.sleep(300);
                }catch (Exception ex) {}
            }
        }
    }.start();
}


Kører det efter hensigten.
Avatar billede snoop_one Nybegynder
22. december 2004 - 12:52 #13
Det der forvirre dig er nok at hver gang du har starter noget Swing eller GUI op i jave bliver der tilføjet (som minimum) en extra tråd til dit program - the event-dispatching thread der står for håndteringen af at "tegne på skærmen" og har til opgave at varetage events.

Hvis vi gennemgår din kode....

myProgressbar myProgressbar = new myProgressbar();
myProgressbar.setVisible(true);

for (int i=0;i<a;i++) {
>køre noget kode<
myProgressbar.setText("Doing " + i + " af " + a)
(Her vil din din jlabell.setText(txt) blive kaldt og det kald bliver sat i den kø der "tegner på skærmen" MEN din kode fortsætter)
}
myProgressbar.dispose();

Nå du når til dette punkt så har du disposed din myprogressbar og det er ikke sikkert at det kald der står i køen er blevet udført!
Avatar billede jeppejensen Nybegynder
22. december 2004 - 13:06 #14
Ok, lyder logisk, nok og synes måske også der er noget der dæmre omkring dette. Men har aldrig brugt tråde, så kan I forklare mig hvordan jeg lige laver denne om så den bruger tråden, som I forklare det:

public static void printReports(ApplicationModule am, String[] report, JPanel panel) {       

        BI2Progressbar bI2Progressbar = new BI2Progressbar();       
        bI2Progressbar.setVisible(true);               
        String localFilename;
        int tmp;
        String[] deleteArray = new String[report.length];
        if (System.getProperty("java.io.tmpdir") == null) {
            ValidationErrorHandler.handleError(new UtilException("Util-5075", "Error"), panel);
        } else {       
            try {
                //The URL of the reportsserver to use is fetched in the table ENV_PARAMETERS
                ViewObject envParamView = am.createViewObjectFromQueryStmt("EnvParamView", "select EnvParameters.VALUE as Value from SYSMODULE.ENV_PARAMETERS EnvParameters where EnvParameters.ENV_PARAMETER_NAME = 'REPORTS_SERVER'");
                Row envParam = envParamView.first();
                String repServer = envParam.getAttribute("VALUE").toString();       
                System.out.println("Antal i []: " + report.length);               
                for (int i=0; report.length > i; i++) {
                    System.out.println("Creating file " + (i+1) + " of " + report.length);
                    progressbar.setText("Creating file " + (i+1) + " of " + report.length);
                    progressbar.repaint();
                    //Putting the file in the users temp dir.
                    localFilename = System.getProperty("java.io.tmpdir") + "\\" + "temp" + System.currentTimeMillis() + ".pdf";
                    URL invoke = new URL(repServer + report[i]);
                    FileOutputStream output = new FileOutputStream(localFilename);
                    InputStream input = invoke.openStream();
               
                    tmp = 0;
                    while (tmp != -1) {
                      tmp = input.read();
                      output.write(tmp);
                    }

                    input.close();
                    output.close();
               
                    deleteArray[i] = localFilename;                   
                }
                System.out.println("Printing");
                for (int i=0;deleteArray.length > i;i++) {                   
                    //Runtime.getRuntime().exec("repPrint " + deleteArray[i]);
                }
                envParamView.remove();
                progressbar.dispose();
                System.out.println("disposing");
            } catch (IOException ex) {
                FailureErrorHandler.handleError(ex, new JPanel());
            }
        }   
    }

Venlig Hilsen
Jeppe
Avatar billede mikkelbm Nybegynder
22. december 2004 - 13:10 #15
Det må blive noget a la:

public static void printReports(ApplicationModule am, String[] report, JPanel panel)
{       
    BI2Progressbar bI2Progressbar = new BI2Progressbar();       
    bI2Progressbar.setVisible(true);               
   
    new Thread()
    {
        public void run()
        {
            String localFilename;
            int tmp;
            String[] deleteArray = new String[report.length];
            if (System.getProperty("java.io.tmpdir") == null) {
                ValidationErrorHandler.handleError(new UtilException("Util-5075", "Error"), panel);
            } else {       
                try {
                    //The URL of the reportsserver to use is fetched in the table ENV_PARAMETERS
                    ViewObject envParamView = am.createViewObjectFromQueryStmt("EnvParamView", "select EnvParameters.VALUE as Value from SYSMODULE.ENV_PARAMETERS EnvParameters where EnvParameters.ENV_PARAMETER_NAME = 'REPORTS_SERVER'");
                    Row envParam = envParamView.first();
                    String repServer = envParam.getAttribute("VALUE").toString();       
                    System.out.println("Antal i []: " + report.length);               
                    for (int i=0; report.length > i; i++) {
                        System.out.println("Creating file " + (i+1) + " of " + report.length);
                        progressbar.setText("Creating file " + (i+1) + " of " + report.length);
                        progressbar.repaint();
                        //Putting the file in the users temp dir.
                        localFilename = System.getProperty("java.io.tmpdir") + "\\" + "temp" + System.currentTimeMillis() + ".pdf";
                        URL invoke = new URL(repServer + report[i]);
                        FileOutputStream output = new FileOutputStream(localFilename);
                        InputStream input = invoke.openStream();
                   
                        tmp = 0;
                        while (tmp != -1) {
                          tmp = input.read();
                          output.write(tmp);
                        }
       
                        input.close();
                        output.close();
                   
                        deleteArray[i] = localFilename;                   
                    }
                    System.out.println("Printing");
                    for (int i=0;deleteArray.length > i;i++) {                   
                        //Runtime.getRuntime().exec("repPrint " + deleteArray[i]);
                    }
                    envParamView.remove();
                    progressbar.dispose();
                    System.out.println("disposing");
                } catch (IOException ex) {
                    FailureErrorHandler.handleError(ex, new JPanel());
                }
            } 
        }
    }.start(); 
}
Avatar billede mikkelbm Nybegynder
22. december 2004 - 13:11 #16
Nogle af dine variabler skal muligvis erklæres final:

public static void printReports(final ApplicationModule am, final String[] report, final JPanel panel)
{       
    final BI2Progressbar bI2Progressbar = new BI2Progressbar();       
    bI2Progressbar.setVisible(true); 

    .....
}
Avatar billede snoop_one Nybegynder
22. december 2004 - 13:14 #17
Tag et kig på http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
nederst på siden er der også et link til "How to monitor Progress". Så for du også en dyber forståelse af hvad der forgår i din egen kode ;0)
Avatar billede jeppejensen Nybegynder
22. december 2004 - 14:50 #18
Jojo der er jo alt hvad man skal bruge.

Har det jeg skal bruge tror jeg.

Nogen der vil smide et svar :)
Avatar billede mikkelbm Nybegynder
22. december 2004 - 14:51 #19
Tjoh...
Avatar billede jeppejensen Nybegynder
22. december 2004 - 15:07 #20
Værsgo og tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester