Avatar billede sqwer Nybegynder
30. januar 2003 - 20:26 Der er 15 kommentarer og
2 løsninger

Applet eller JApplet

Hvad er der af fordele og ulemper ved Applets kontra JApplets?
JApplets ser bedre ud, men er der mange der ikke kan bruge dem?
Kan der evt. laves en løsning som viser en JApplet hvis det er muligt, og en Applet ellers?
Avatar billede arne_v Ekspert
30. januar 2003 - 20:37 #1
Hvis jeg husker rigtigt så er Applet AWT og JApplet Swing.

Uden på nogen måde at være applet ekseprt vil jeg formode, at
JApplet generelt er bedre, fordi Swing er bedre end AWT.

Og problemet er at MS's antikke JVM ikke understøtter Swing.

Jeg har umiddelbart svært ved at forestille mig at man kunne
lave en combo, men det må du hellere få en melding på fra nogle
mere applet kyndige end mig.
Avatar billede _carsten Nybegynder
30. januar 2003 - 22:37 #2
Her er en lidt primitiv JApplet du kan afprøve

HTML-delen
<html>
<applet code="Test.class" width=560 height=125>
</applet>
</html>

java-delen
   


    import java.awt.*;   
    import java.awt.event.*;
    import java.awt.Graphics;
    import javax.swing.*;
    import java.text.DecimalFormat;
   
   
    public class Test extends JApplet implements ActionListener
    { 
        //    DEFENITION AF DE GRAFISKE KOMPONENTER
        JTextField felt1, felt2, felt3, felt4, felt5, felt6;
        JLabel lab1, lab2, lab3, lab4, lab5, lab6, lab7, lab8;
        JComboBox box1, box2;
        JButton beregn, rensfelt;
        double antalGram = 0,  antalBreve = 0, antalPakker = 0, brevpris = 0, prisPakker = 0;

        String forsendelse = "";
       
        //    OPSÆTNING AF DE GRAFISKE KOMPONENTER
        public void init()
        {  Container c = getContentPane();
            c.setLayout ( new FlowLayout() );
           
            //    KOMPONENTER VEDRØRENDE BREVE
            lab1 = new JLabel ( "  Antal breve " );  c.add( lab1 );
           
            felt1 = new JTextField( 5 );  felt1.setEditable( true);  c.add( felt1);
           
            lab3 = new JLabel ( "    Gns. vægt i gram " );  c.add( lab3 );
           
            felt2 = new JTextField( 5 );  felt2.setEditable( true);    c.add( felt2);
           
            lab2 = new JLabel ( "    Leveringsform" );    c.add( lab2 );
           
            box1 = new JComboBox();  box1.setEditable( true );
                    box1.addItem("");  box1.addItem("Straks");  box1.addItem("Næste dag");
                    box1.addItem("2. næste dag");      c.add( box1);
           
           
            //    KOMPONENTER VEDRØRENDE PAKKER
            lab4 = new JLabel ( "Antal pakker " );  c.add( lab4 );
           
            felt3 = new JTextField( 5 );  felt3.setEditable( true);  c.add( felt3);
           
            lab5 = new JLabel ( "    Gns. vægt i gram " );  c.add( lab5 );
           
            felt4 = new JTextField( 5 );  felt4.setEditable( true);  c.add( felt4);
           
            lab6 = new JLabel ( "    Leveringsform" );  c.add( lab6 );
           
            box2 = new JComboBox();  box2.setEditable( true );
                    box2.addItem("");  box2.addItem("Straks");  box2.addItem("Næste dag");
                    box2.addItem("2. næste dag");    c.add( box2);
                     
           
            //    SUMFELTER VEDRØRENDE BREVE OG PAKKER
            lab7 = new JLabel ( "              Pris breve ialt: " );    c.add( lab7 );
           
            felt5 = new JTextField( 8 );  felt5.setEditable( false);  c.add( felt5);
           
            lab8 = new JLabel ( "              Pris pakker ialt: " );    c.add( lab8 );
           
            felt6 = new JTextField( 8 );      felt6.setEditable( false );    c.add( felt6);
         
          //    KNAPPER
            beregn = new JButton ( "Beregn pris" );  beregn.addActionListener( this );    c.add( beregn );
           
            rensfelt = new JButton ( "Rens felter" );  rensfelt.addActionListener( this );    c.add( rensfelt );
           
        }    //    Slut på init
 




        public void actionPerformed( ActionEvent e )
        {
          if ( e.getSource() == rensfelt )
          {  felt1.setText("");  felt2.setText("");  felt3.setText("");
              felt4.setText("");  felt5.setText("");  felt6.setText("");
              box1.setSelectedItem("");    box2.setSelectedItem("");
              brevpris = 0;    prisPakker = 0;
              showStatus("Klar til at beregne pris på nye forsendelser.");
             
          }    //    Slut knap rensfelt





          //    UDGANGSPUNKTET FOR BEREGNING AF PRISER
          if ( e.getSource() == beregn )
          {  if (felt1.getText() != null && felt2.getText() != null && box1.getSelectedItem() != null && box1.getSelectedItem() != "")
                {    antalBreve = Double.parseDouble( felt1.getText() );
                        if ( antalBreve > 0 )
                            brevpris = beregnBreve(antalBreve);
                }
               
                if (felt3.getText() != null && felt4.getText() != null && box2.getSelectedItem() != null && box2.getSelectedItem() != "")
                {    antalPakker = Double.parseDouble( felt3.getText() );
                        if ( antalPakker > 0 )
                          prisPakker = beregnPakker( antalPakker );
                }
                               
                DecimalFormat output = new DecimalFormat( "0.00" );
               
                felt5.setText( "" + output.format( brevpris ));
                felt6.setText( "" + output.format( prisPakker ));
               
                showStatus( "Samlet pris vedrørende denne forsendelse, kr.  " +  output.format( brevpris + prisPakker ) );
               
          }    //    Slut knap beregn
        }    //    Slut på actionPerformed
       
       


       
        //    BEREGNING AF PRIS VED FORSENDELSE AF BREVE
        public double beregnBreve( double antalBreve)
        {  double grundpris = 0, brev = 0;
            int basis = 0;
       
            forsendelse =  (String) box1.getSelectedItem();
            antalGram = Double.parseDouble( felt2.getText() );

              if ( forsendelse.equalsIgnoreCase("Straks") )
                  { brev = 50.45;
                    basis = 0;
                  }
              else
                  if ( forsendelse.equalsIgnoreCase("Næste dag") )
                  {  brev = 10.00;
                      basis = 100;
                  }
                  else
                      if ( forsendelse.equalsIgnoreCase("2. næste dag") )
                      {  brev = 2.00;
                          basis = 20;
                      }

              if ( basis > 0 )
                  grundpris = brev *  (int) (Math.floor( antalGram / basis ) + 1 );
              else
                  grundpris = brev *  (int) (Math.floor( antalGram / 100 ) + 1);

              return antalBreve * grundpris;
       
        }    //    Slut beregnBreve
       
       
       
       
       
        //    BEREGNING AF PRIS VED PAKKEFORSENDELSER
        public double beregnPakker( double antalPakker )
        {    double pakkepris = 0;
       
            forsendelse =  (String) box2.getSelectedItem();
            antalGram = Double.parseDouble( felt4.getText() );

              if ( forsendelse.equalsIgnoreCase("Straks") )
                  {    if ( antalGram < 500)
                            pakkepris = 60;
                        else
                            if ( antalGram >= 500 && antalGram < 5000 )
                                pakkepris = 100;
                            else
                                if ( antalGram >= 5000 )
                                  pakkepris = 100 + 20 * (int) Math.floor( (antalGram - 5000) / 1000 );
                  }
              else
                  if ( forsendelse.equalsIgnoreCase("Næste dag") )
                      {    if ( antalGram < 500)
                                pakkepris = 30;
                            else
                                if ( antalGram >= 500 && antalGram < 5000 )
                                    pakkepris = 50;
                                else
                                    if ( antalGram >= 5000 )
                                      pakkepris = 50 + 10 * (int) Math.floor( (antalGram - 5000) / 1000 );
                      }
                  else
                      if ( forsendelse.equalsIgnoreCase("2. næste dag") )
                      { 
                          pakkepris = 20 + 5 * (int) (Math.floor( antalGram / 1000 ) + 1);
                      }
             
            return antalPakker * pakkepris;
           
        }    //    Slut beregnPakker
      }      //    Slut på class
Avatar billede magoo20000 Nybegynder
31. januar 2003 - 13:03 #3
Så skal du ind og se på nogle af system properties på klienten - prøv at se om din Applet kan spytte følgende ud:

public void init() {

        java.util.Properties prop = System.getProperties();
        java.util.Enumeration enum = prop.propertyNames();

        cat.info("System Environment As Seen By Java");
        cat.debug("Format: PROPERTY = VALUE");

        while (enum.hasMoreElements()){
            String key = (String) enum.nextElement();
            cat.info(key + " = " + System.getProperty(key));
        }
    }

Så kan du få oplyst, hvilken JVM der bliver brugt, og derfra foretage dit valg
Avatar billede sqwer Nybegynder
31. januar 2003 - 20:35 #4
carsten > som illustrerer hvad? Jeg kan godt finde ud af at lave det, jeg ved bare ikke om jeg skal satse på Applet eller JApplet.

magoo > er der noget tekst i dit svar, eller er det en fejl? Jeg kan ikke se nogen tekst, men på et tidspunkt kunne jeg heller ikke se mit eget spørgsmål...
Avatar billede arne_v Ekspert
31. januar 2003 - 20:37 #5
Magoo havde postet et svar hvori han viste hvordan man spurgte Java om
JVM versionen.

Det er vist gået tabt i database problemerne her på eksperten.
Avatar billede arne_v Ekspert
31. januar 2003 - 20:38 #6
Mit svar hvordi jeg påpegede at det er nemt at finde JVM versionen, men
svært at arve fra den ene eller anden klasse afhængig af svaret er
også sporløstt forsvundet !
Avatar billede magoo20000 Nybegynder
31. januar 2003 - 21:28 #7
Jeg prøver igen!

public void init() {

        java.util.Properties prop = System.getProperties();
        java.util.Enumeration enum = prop.propertyNames();

        cat.info("System Environment As Seen By Java");
        cat.debug("Format: PROPERTY = VALUE");

        while (enum.hasMoreElements()){
            String key = (String) enum.nextElement();
            cat.info(key + " = " + System.getProperty(key));
        }
    }

Med denne kode kan du, som arne nævner, se JVM versionen og afgører, om klienten kan håndterer Swing eller/og AWT komponenter.

Ellers er jeg helt enig i arne mht.   
"Svar: arne_v 30/01-2003 20:37:39".

Jeg ville nok satse på en Applet med AWT, så er du på den sikre side, men hvorfor ikke JSP eller andet ligende?

Og ja, der sker underlige ting her på Eksperten!
Avatar billede magoo20000 Nybegynder
31. januar 2003 - 21:30 #8
Hov! cat skal udskiftes med System.out.println() - det er et levn fra BEAs ILogger klasse til logning.
Avatar billede sqwer Nybegynder
01. februar 2003 - 11:48 #9
Det begynder at se lidt nedslående ud...
Jeg skal bla. have to lister der følges ad når man scroller (så linie 5 hele tiden står ud for linie 5 osv.). Jeg har tidligere lavet dette med Swing, men ved nærmere eftersyn er jeg da slet ikke sikker på at det kan gøres med AWT... (jeg har aldrig rigtig brugt det, så jeg ved det ikke).

Jeg prøver at lave noget ud fra magoos svar; det må være System.getProperty("java.vm.version") jeg skal bruge, men er der nogen der kan sige mig hvilke versioner der kan bruge Swing?
Avatar billede arne_v Ekspert
01. februar 2003 - 12:17 #10
Jeg mener det blev tilføjet til 1.2 men kan downloades separat
til 1.1.
Avatar billede sqwer Nybegynder
01. februar 2003 - 15:21 #11
Jeg har siddet og leget lidt med det, og er nu kommet frem til noget jeg synes virker ret besynderligt, men som klogere folk måske kan forklare mig...
Jeg har bla.:

javax.swing.JTextField jtext;
javax.swing.JTextField jtext2;
static boolean swi = false;

public void init(){
try{
  jtext = new javax.swing.JTextField("bla bla");
  swi = true;
}
catch(Exception e){}

if(swi)
{
  // her kommer det sjove!
}
}

Hvis jeg nu indsætter jtext2 = new javax.swing.JTextField("bla"); i if-sætningen er der ingen problemer. Den læses jo kun hvis swi er sat til true, så det virker rimeligt nok.
Men hvis jeg fx skriver jtext.setText("bla"); - eller hvad jeg ellers kan finde på at gøre ved jtext - går den i baglås (exception: java.lang.ClassNotFoundException: javax.swing.text.JTextComponent). Og det fatter jeg ikke, den skal jo slet ikke læse noget inde i den if-sætning!
Endnu mere absurd virker det at hvis jeg skriver if(false) i stedet for if(swi) kan den også godt håndtere det sidste eksempel...

"Den" er forresten IE5, som ikke kan klare swing. Den kunne heller ikke lide System.getProperty(), så jeg kom på ovenstående konstruktion i stedet.
Avatar billede magoo20000 Nybegynder
01. februar 2003 - 17:25 #12
import javax.swing.*;
import java.applet.Applet;
/**
* Created by IntelliJ IDEA.
* User: Martin
* Date: Feb 1, 2003
* Time: 5:08:48 PM
* To change this template use Options | File Templates.
*/

public class App extends JApplet {
javax.swing.JTextField jtext;
javax.swing.JTextField jtext2;
static boolean swi = false;

    public void init() {
        getContentPane().setLayout(new BorderLayout());

        try{
            jtext = new javax.swing.JTextField("bla bla");
            swi = true;
            jtext.setText("bla");
            this.getContentPane().add("South", jtext);

        }
catch(Exception e){
            System.out.println( "!!!!" );
}

if(swi)
{
System.out.println( "GO!" );
      jtext.setText("!!!!!!!!!");
}
    }

}

Virker fint her hos mig!
Avatar billede sqwer Nybegynder
01. februar 2003 - 22:05 #13
Det jeg prøver er at lave det uden "import javax.swing.*;"...
Avatar billede magoo20000 Nybegynder
02. februar 2003 - 15:28 #14
Så skal du nok lave to subklasser - en til swt og en til swing, for det du prøver på, kan ikke lade sig gøre uden at arve fra JApplet(ved swing) eller Applet (ved awt).
Avatar billede sqwer Nybegynder
02. februar 2003 - 21:31 #15
Det her er da tæt på at fungere:

import java.applet.Applet;
import java.awt.*;

public class test extends Applet
{
javax.swing.JButton jb;
Button b = new Button("knap");
static boolean swi = false;

public void init(){
  try{
  jb = new javax.swing.JButton("swing-knap");
  swi = true;
  }
  catch(Exception e){}

  if(swi)
  {
  add(jb);
  }
  else
  add(b);
}
}

Min "swing-browser" gør præcis det den skal (viser en swing-knap), og hvis jeg udkommenterer linien "add(jb);" gør "ikke-swing-browseren" det også (viser en alm. knap).
Det eneste problem er at "ikke-swing-browseren" brokker sig over indholdet af if-sætningen, selv om den slet ikke skal bruge det.
Jeg indrømmer gerne at jeg ikke ved så meget om det her, så hvis du igen siger at det ikke kan lade sig gøre tror jeg på det, jeg synes bare det er en meget mærkelig måde det viser sig på.
Avatar billede =maddog= Nybegynder
04. februar 2003 - 04:20 #16
Problemet mellem swing og awt er at swing komponenter kræver en look-and-feel (se evt. javax.swing.plaf) for at blive renderet. Desuden er opbygningen med glass, content og root panes heller ikke guld sammen med awt.
Det kan lade sig gøre at lave hæderlige appletter med AWT. Man skal kæmpe mod manglende double buffer ved gentegning og en lidt stivere Event håndtering.
Denne applet er 100% AWT: http://morrowind.melian.cc/potionmachine/
Ganske nysselig og næsten alle komponenter er hardcoded underklasser af Component. Det er tilgengæld tydeligt at jeg ikke fik lavet et dobbelt bufferet Panel (tsk tsk), men det skulle da kunne lade sig gøre hvis tiden havde været der.
Sig til hvis der er nogen, som er interesserede i at jeg laver en lille tutorial i lightweight AWT komponenter. Er selv stort set autodedakt så det bliver på lægmandssprog.
AWT tillader ikke at man arver fra TextComponent, da denne har protected constructor. Så hvis man skal lave det mindste tekst layout (HTML o.s.v.) er man NØD til at bruge swing. Min egen (beskedne) erfaring er
AWT == tungt, men fleksibelt og bedre browser kompatibilitet.
swing == let og gennemført, men sværere at udbygge.
Avatar billede =maddog= Nybegynder
04. februar 2003 - 04:45 #17
mht. at lave en swing applet, der samtidigt kan bruges med gamle browsere tvivler jeg på at det kan lade sig gøre. Hvis man vitterligt er opsat på at lave to versioner vil jeg foreslå et javascript til at bestemme indholdet af applet/object tagget afhængig af browseren. Ellers kan jeg kun tænke mig til en Classloader løsning (med hvilket jeg har 0 erfaring).
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