Avatar billede chrishunter Nybegynder
22. juni 2009 - 10:08 Der er 9 kommentarer og
1 løsning

avanceret pop-up vindue i Groovy (i Freemind)

Hvordan laver jeg i Groovy (som er "An agile dynamic language for the Java Platform") i Freemind (som er "free mind mapping software") et pop-up vindue, hvor der eksempelvis er
- to Editable Combo Boxes,
- en Input Dialog
- og en Check Box?

Jeg kan allerede lave scripts, hvor jeg f.eks. kan få brugerinput v.h.a. et pop-up vindue:

  import javax.swing.*;
  ...
  svar = JOptionPane.showInputDialog(null, spoergsmaal, defaultsvar);
  ...

(når jeg bare husker, at den første parameter, som er 'parentComponent', skal være null).

Men det kniber med mere avancerede eksempler, som jeg har fundet på Internet og forsøgt mig med.
De virker ikke, når de bare kopieres over i et script. Og, når noget i et script ikke virker, reagerer Freemind med at ignorere hele scriptet, så der bare intet sker, og der heller ikke kommer nogen fejlmeddelelse.


Hjææææælp ;-)

Christian
Avatar billede arne_v Ekspert
22. juni 2009 - 12:03 #2
Principielt bør du jo kunne lave GUI i Java og så kalde den fra Groovy !
Avatar billede chrishunter Nybegynder
23. juni 2009 - 07:48 #3
Tak Arne!

Jeg har forsøgt mig med eksemplerne i de to links, du har henvist til.
Og jeg kan få det første fra http://groovy.codehaus.org/Swing+Builder til at virke (om end vinduet på min computer bliver noget større end det viste eksempel) men ingen af de andre.

Hvad kan mon være galt?
Avatar billede arne_v Ekspert
24. juni 2009 - 01:23 #4
Hvilken fejl får du?

Tester du via Freemind eller standalone?
Avatar billede chrishunter Nybegynder
24. juni 2009 - 07:31 #5
Da jeg skrev igår, havde jeg kun testet i Freemind. Og Freemind gør bare det, at hele scriptet ignoreres, hvis der er en fejl. Så man får ingen fejlmeddelelse.

Siden har jeg forsøgt mig med Eclipse SDK. Og deri virker alle tre scripts fra http://groovy.codehaus.org/Swing+Builder, mens der i http://kousenit.wordpress.com/2008/10/03/making-swing-groovy-part-ii-binding/ i det fjerde eksempel popper et vindue med noget, der ligner et eksempel på et minimalt filsystem, og AST JTRee Example som title i bjælken øverst.
Og i femte eksempel gør Eclipse opmærksom på, at scriptet er unable to resolve class groovy.beans.Bindable. Så jeg skal nok have noget mere installeret, hvis dette skal virke.

Men måske er din idé med at lave GUI i Java og så kalde den fra Groovy den rigtige. For så kan jeg teste alt i Eclipse, hvis jeg bare én gang har fået det med at kalde fra Groovy til at virke.
Så hvordan gør jeg det?
Avatar billede arne_v Ekspert
24. juni 2009 - 18:58 #6
o = new mypackage.MyClass()
o.mymethod()
Avatar billede chrishunter Nybegynder
02. juli 2009 - 08:22 #7
Nå, det endte med, at jeg gik igang fra en ende af (i en bog, jeg for mange år siden investerede i) og fandt frem til følgende, der i princippet virker:

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

class MyDialog extends JDialog implements ActionListener {
    private static final int FRAME_WIDTH          = 340;
    private static final int FRAME_HEIGHT        = 400;
    private static final int FRAME_X_ORIGIN      = 400;
    private static final int FRAME_Y_ORIGIN      = 400;
   
    private static final int BUTTON_WIDTH        =  60;
    private static final int BUTTON_HEIGTH        =  30;

    private static final int LABEL_WIDTH  =  LEFT_INPUT_BORDER - 22
   
    private static final int TEXTFIELD_WIDTH  = FRAME_WIDTH - 144
    private static final int TEXTFIELD_HEIGTH    =  25;

    /* constructor */
    public TaskDialog(param1, ... ) {
        setSize      ( FRAME_WIDTH, FRAME_HEIGHT );
        setLayout    ( null );
        setResizable ( false );
        setTitle    ( "vinduets titel");
        setLocation  ( FRAME_X_ORIGIN, FRAME_Y_ORIGIN );

       
        Label input1Label = new Label ( "input 1:" )
        input1Label.setBounds (LEFT_TEXT_BORDER, verticalBorder, LABEL_WIDTH, TEXTFIELD_HEIGTH);
        TextField input1Field = new TextField ( param1);
        input1Field (22, 47, TEXTFIELD_WIDTH, TEXTFIELD_HEIGTH);
        add( input1Label )
        add( input1Field );
...
        Button okButton = new Button( "OK");
...
        Button cancelButton = new Button( "Cancel");
        cancelButton.setBounds (...);
        add( cancelButton );
        cancelButton.addActionListener( this )

    }
   
    public void actionPerformed ( ActionEvent event ) {
        String label = event.getActionCommand();
       
        if (label.equals("OK")) {
            //gør noget afsluttende
            dispose();
        } else {
            dispose();
        }
    }

}

...

def frame = new MyDialog()
...

Problemet er så, at programmet kører videre, når vinduet er poppet op, hvilket ikke er så godt, da det er meningen, at der skal gåes rekursivt gennem en del noder, der skal ændres via dialogen i vinduet.
Det kan til en vis grad afhjælpes ved at gøre vinduet modal (med setModal(true) til at starte med og så lige huske at sætte false igen, inden vinduet lukkes). Men så har jeg et nyt problem med at få de data, dialogen skulle give, med videre i programmet.

Nå, det er et emne for et andet spørgsmål i en ny tråd - fik jeg nævnt, at jeg ikke er særligt erfaren i Java endsige i OOP? ;-)

Arne, i øvrigt, vil du have point? Du har trods alt brugt tid på tråden her.
Avatar billede arne_v Ekspert
02. august 2009 - 04:55 #8
ok
Avatar billede chrishunter Nybegynder
08. oktober 2009 - 18:25 #9
slut
Avatar billede arne_v Ekspert
08. oktober 2009 - 18:31 #10
Naa - du fortroed tilbuddet om point.
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