Avatar billede louiselahn Nybegynder
06. november 2003 - 09:01 Der er 11 kommentarer og
1 løsning

problemer med at omdanne applet til applikation (via javax swing)

Hej eksperter
Er der mon nogen, der kan hjælpe mig??? Jeg arbejder med Javax Swing for første gang og er kørt rimelig meget fast.

Jeg er ved at omdanne en fungerende applet til en applikation. Projektet består af en del ”funktionsklasser” (uppercase, lowercase osv.), som jeg formoder virker – det gjorde de i hvert fald under appletten. Disse er ikke medsendt.

Jeg tror måske noget af  problemet ligger i mine if-else statements i StringAnalyzerklassen. Det, der ikke virker er ”Sæt”-knappen. Dvs. tekstfeltet bliver aldrig sat og dermed kan de forskellige metoder ikke kaldes. Jeg håber der er én, der kan kaste lidt lys over sagen… På forhånd tak! Louise.

(Jeg medsender StringAnalyzer-klassen, samt startklassen og et StringHolder-interface– hvis der er brug for mere så sig endelig til!)

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

/**
* @author Louise Lahn
* @version november 2003
*/

public class StringAnalyzer extends JFrame
                            implements ActionListener, KeyPadClient {

    private WrappedTextArea area = new WrappedTextArea(50, 100);
   
    private JButton sæt = new JButton (" Sæt tekst");
    private JLabel info = new JLabel (" Indtast din tekst nedenfor og tryk her:        ");
    private JLabel tom1 = new JLabel ("          ");
    private JLabel tom2 = new JLabel ("          ");
    private Knapper knapper = new Knapper(this);
    private KeyPadClient kpc;
   
    private final StringHolder empty = new EmptyText();
    private StringHolder original;
    private StringHolder lowercased;
    private StringHolder uppercased;
    private StringHolder purified;
    private StringHolder lixified;

    private boolean isAnalyzing;

    public StringAnalyzer() {
       
        //getContentPane().setLayout(new BorderLayout());
                         
        JPanel infoPanel = new JPanel();
        infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.X_AXIS));
        infoPanel.setBorder(BorderFactory.createTitledBorder("Louises tekstmanipulator"));
     
        infoPanel.add(info);
        infoPanel.add(sæt);
        sæt.addActionListener(this);
        getContentPane().add(infoPanel, "North");       
       
        //JPanel Knapper = new JPanel();       
        getContentPane().add(knapper, "South");         
        getContentPane().add(tom1, "West");
        getContentPane().add(tom2, "East");
       
        getContentPane().add(area, "Center");
        area.setBorder(BorderFactory.createTitledBorder("Skriv her:"));
        area.setLineWrap(true);
        area.setEditable(true);
               
        setAnalyzeMode(false);
    } 

    public void setAnalyzeMode(boolean is) {
        isAnalyzing = is;       
        knapper.setEnabled(isAnalyzing);         
       
        if (isAnalyzing) { 
            sæt.setEnabled(isAnalyzing);   
            area.setEditable(false); //farvet
        } else {         
            area.setText(empty);
            area.setEditable(true); //hvid
           
        }     
    }
   
    public void actionPerformed(ActionEvent e) {
        String keylabel = ((JButton)e.getSource()).getText();
        kpc.keypressCallback(keylabel);
    }
       
    public void keypressCallback(String s){
     
        if (s.equals(" Original tekst ")) {
            area.setText(original);
           
        } else if (s.equals(" Små bogstaver ")) {
            area.setText(lowercased);
           
        } else if (s.equals(" Store bogstaver ")) {
            area.setText(uppercased); 
           
        } else if (s.equals( " Renset tekst")) {
            area.setText(purified);
       
        } else if (s.equals(" Lixtal ")) {
            area.setText(lixified);
       
        } else if (s.equals(" Sæt tekst")) {
            if (isAnalyzing){
                setAnalyzeMode(false);
                area.setEditable(false);
                knapper.setEnabled(isAnalyzing);
               
        } else if (s.equals(" Ryd tekstbox ")){
                String newText = area.getText();
                original = new OriginalText(newText);
                lowercased = new LowercaseText(newText);
                uppercased = new UppercaseText(newText);
                purified = new PurifyText(newText);
                lixified = new LixText(newText);
                setAnalyzeMode(true);
            }
            validate();
            }
       
    }
}
       


/**
* @author (Louise)
* @version (November 2003)
*/
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 

public class SAStart{
       
    public static void main(String args[]) {
        try {
          UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) { }
        StringAnalyzer sa = new StringAnalyzer();
        sa.setSize(500, 500); 
        sa.setVisible(true);
        sa.addWindowListener(new WindowAdapter() {     
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });   
    }
}


/**
* @author Louise
* @version nov.  03
*/

public interface StringHolder {
    public final String DELIMS = " .,!?\n\t";
    public String getTransformed();
    public String getTransformation();
   
}
Avatar billede louiselahn Nybegynder
06. november 2003 - 09:06 #1
Jeg kom lige i tanke om, at jeg måske skulle medsende flere klasser:
/**
* @author Louise Lahn
* @version 23 okt 2003
*/

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

public class Knapper extends JPanel implements ActionListener{
    private final static int FBUTTONS = 6;
    private KeyPadClient kpc;

    private JButton buttons [];
    private String labels [] =
        {" Original tekst ", " Små bogstaver ", " Store bogstaver ",
        " Renset tekst"," Lixtal ", "Ryd tekstbox"};
   
     
    public Knapper(KeyPadClient kpc) {
        this.kpc = kpc;
        buttons = new JButton [FBUTTONS];
        setLayout(new GridLayout(2,3,10,10));

        for (int k=0; k<buttons.length; k++){
            buttons[k]= new JButton(labels[k]);
            buttons[k].addActionListener(this);
            add(buttons[k]);
        }       
    }
   
    public void actionPerformed(ActionEvent e){
        String keylabel = ((JButton)e.getSource()).getText();
        kpc.keypressCallback(keylabel);
    }
       
}


/**
* Write a description of interface KeyPadClient here.
*
* @author (Louise)
* @version (nov. 2003)
*/

public abstract interface KeyPadClient {
    public void keypressCallback(String s);
}
Avatar billede _carsten Nybegynder
06. november 2003 - 10:10 #2
Hvad mener du lige med at tekstfeltet ikke bliver "sat" ?

Det eneste jeg sådan lige kan finde af eventuelle fejl er din
  s.equals(" Ryd tekstbox ")){        i din keypressCallback(String s){

  i din Knapper class har du fjernet fjernet mellemrummet før og efter
  Ryd tekstbox, altså:    "Ryd tekstbox" equals " Ryd tekstbox " duer ikke
Avatar billede louiselahn Nybegynder
06. november 2003 - 10:20 #3
nå for pokker - det må jeg lige afprøve (jeg har modemforbindelse æv dyrt! - så jeg hopper af og checker...)

Det med at tekstfeltet skal "sættes" betyder bare at når knappen "sæt" har været aktiveret bliver tekstfeltet "uredigerbart" og får en anden farve hvorefter de andre knapper kan trykkes på.
Avatar billede louiselahn Nybegynder
06. november 2003 - 10:33 #4
den fejl med mellemrummet havde jeg lavet flere gange - ups. men det er rettet nu. det havde dog ingen betydning, da det stadig ikke virker.æv.

jeg får en laaaang fejlmeddelse som jeg overhovedet ikke kan tyde:
java.lang.NullPointerException

    at StringAnalyzer.actionPerformed(StringAnalyzer.java:74)

    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)

    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)

    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)

    at java.awt.Component.processMouseEvent(Component.java:5100)

    at java.awt.Component.processEvent(Component.java:4897)

    at java.awt.Container.processEvent(Container.java:1569)

    at java.awt.Component.dispatchEventImpl(Component.java:3615)

    at java.awt.Container.dispatchEventImpl(Container.java:1627)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)

    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)

    at java.awt.Container.dispatchEventImpl(Container.java:1613)

    at java.awt.Window.dispatchEventImpl(Window.java:1606)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)




hvad mon de tal osv. refererer til?
Avatar billede _carsten Nybegynder
06. november 2003 - 11:27 #5
Der er et par par ting jeg ikke forstår...

Du implementerer interfacet KeyPadClient og metoden i StringAnalyzer
public class StringAnalyzer extends JFrame
                            implements ActionListener, KeyPadClient {

Hvorfor gør du så dette ?
    private KeyPadClient kpc;
      // Og senere i din actionPerformed
      public void actionPerformed(ActionEvent e) {
          String keylabel = ((JButton)e.getSource()).getText();
          kpc.keypressCallback(keylabel); // ???????????????????????????
   
          keypressCallback(keylabel); // Sådan
      }

Du får aldrig kaldt din: public void keypressCallback(String s){
i StringAnalyzer, med mindre der sker et eller andet fancy i EmptyText()
og det tvivler jeg på.

Måske skulle vi lige have klassen EmptyText() at se også !
Avatar billede louiselahn Nybegynder
06. november 2003 - 11:35 #6
Hej igen
nej der sker vist ikke noget fancy... her er lidt flere klasser at kigge på. mht hvorfor jeg gør sådan er fordi at sådan har jeg læst det, der står i lærebogen om et andet eksempel."Java, java java" af Ralph Morelli. Så jeg forstår det sådan set ikke - jeg har bare prøvet at efterligne... Nogle forslag til hvad, jeg kan gøre ved det?


/**
* @author Louise
* @version 17 mar 2003
*/

public class EmptyText implements StringHolder {
   
    public EmptyText() {}
       
    public String getTransformation() {
        return "(empty)";
    }

    public String getTransformed() {
        return "  ";
    }
}



/**
* @author Louise
* @version 17 mar 03
*/

public interface StringHolder {
    public final String DELIMS = " .,!?\n\t";
    public String getTransformed();
    public String getTransformation();
   
}


/**
* @author Louise
* @version 10 oct 2002, revised 17 mar 2003
*/
import java.awt.event.*;
import javax.swing.*; 
import java.util.StringTokenizer;
import java.awt.*;

public class WrappedTextArea extends JTextArea {

    private final static Color disabledColor = new Color(225, 240, 240);

    private int rows;
    private int columns;
    private StringHolder stringHolder = null;
       
    public WrappedTextArea(int r, int c) {
        super(r, c) ;
        rows = r;
        columns = c;
    }

    // --- Mutators ---
   
    public void setText(StringHolder stringHolder) {
        StringBuffer sb = new StringBuffer();
        String token;
        String unwrappedText = stringHolder.getTransformed();

        StringTokenizer tnzr = new StringTokenizer(unwrappedText, " ");
        int remaining = columns;

        while (tnzr.hasMoreTokens()) {
            token = tnzr.nextToken();
            if (token.length() >= remaining) {
                sb.append("\n");
                remaining = columns;
            }
            sb.append(token + " ");
            remaining = remaining - token.length() - 1;
        }
       
        super.setText(
            "Transformation = " + stringHolder.getTransformation()
            + '\n' + "--------------------------------------------------\n"
            + sb.toString());
    }
   
    public void setEditable(boolean isEditable) { //overrides TextArea.setEditable(boolean)
        super.setEditable(isEditable);
        if (isEditable) {
            setBackground(Color.white);
        } else {
            setBackground(disabledColor);
        }
    }
}
Avatar billede _carsten Nybegynder
06. november 2003 - 14:32 #7
Så er jeg tilbage igen for en kort stund

Sådan kan han godt have anvendt et interface, situation har bare en anden

Prøv at rette:    kpc.keypressCallback(keylabel);
Til:              keypressCallback(keylabel);

Og se om ikke det giver den ønskede effekt.
Avatar billede louiselahn Nybegynder
06. november 2003 - 17:05 #8
øøøv - det gør det desværre ikke :-(

andre gode forslag?
Avatar billede _carsten Nybegynder
06. november 2003 - 23:10 #9
Så har jeg snart kun et forslag tilbage, smid de klasser der mangler for at jeg kan køre det - jeg har formentlig lidt tid i overskud i morgen formiddag,
så skal jeg kigge lidt mere seriøst på det.
Avatar billede louiselahn Nybegynder
10. december 2003 - 21:28 #10
Hej carsten
jeg kom helt fra det igen - undskyld. Men det var vist delvist rigtigt hvad du sagde, så hvis du smider et svar får du pointene :-)
Avatar billede _carsten Nybegynder
10. december 2003 - 21:31 #11
Jamen det gør jeg så

Det var svaret !
Avatar billede louiselahn Nybegynder
11. december 2003 - 00:56 #12
og tak for hjælpen :-)
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

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