22. december 2004 - 09:05Der 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();
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.
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();
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();
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(); } } }
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
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.
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!
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();
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);
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.