[JAVA]Simpele tekstverwerker met buttons voor FONT

Pagina: 1
Acties:
  • 218 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Ik ben bezig met een simpele tekstverwerker te programmeren om JAVA een beetje onder de knie te krijgen.

Nu zitten er in de Applet 3 Checkboxjes waarmee ik het lettertype naar BOLD , ITALIC of PLAIN kan veranderen zodra ik een van deze aanklik

Mijn probleem is dat ik JAVA nog niet zo heel goed beheers.
Ik loop nu vast op het gedeelte dat de class "controller" een waarde moet afgeven aan de volgende regel
code:
1
setFont (new Font("MonoSpaces",controller.setfont(),16))

In controller.setfont moet dus een waarde komen te staan die bepaald word aan de hand van de checkbox die is aangevinkt.

Alleen nu kom ik er niet meer helemaal aan uit , hij blijkt dus de waarde niet helemaal correct af te geven.
Ik vermoed(ik beheers JAVA nog niet zo goed , dat ik het probleem zelf kan oplossen) dat het
Ergens in de class View niet goed gaat.....Maar dat kan ik helaas niet met zekerheid zeggen omdat ik het hele verhaaltje niet goed snap....

Ter verduidelijking is dit mijn gehele code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class test extends Applet
{
        private View view;
        private Controller controller;
        
        public void init()
        {
            setLayout(new BorderLayout());
            
            view = new View();
            controller = new Controller(view);
            
            add(view , BorderLayout.NORTH);
            add(controller , BorderLayout.SOUTH);
        }
}

class View extends Panel
{
    private TextArea veld;
    private Controller controller;
    
    public View()
    {
        veld = new TextArea();
        controller = new Controller();
        add(veld);
        
        
        setFont(new Font("SansSerif",controller.setfont(),16));
    }
}

class Controller extends Panel
{
    private CheckboxGroup driestand;
    private Checkbox vet , cursief , onderstreep;
    private View view;
    private Object bron;
    
    public Controller(View view)
    {
        this.view = view;
        driestand = new CheckboxGroup();
        
        vet = new Checkbox("vet" ,driestand , true);
        bron = vet;
        cursief = new Checkbox("cursief" , driestand , false);
        onderstreep = new Checkbox("onderstreept", driestand , false);
        
        Keuzehandler keuzehandler = new Keuzehandler();
        vet.addItemListener(keuzehandler);
        cursief.addItemListener(keuzehandler);
        onderstreep.addItemListener(keuzehandler);
        
        add(vet);
        add(cursief);
        add(onderstreep);
    }
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }
    
        String setfont()
    {     //hier moet een if statement komen dat kijkt welke knop is aangeklikt
        return "Font.BOLD";
    }
}


Hopelijk kunnen jullie mij weer een beetje de goede richting in sturen....

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 26-03 12:06

bvp

Dit ligt aan je method (in je class Controller):

String setFont() {
return "Font.BOLD";
}

maak hier maar es van:

int setFont() {
return Font.BOLD;
}

Verder moet (in je class View): controller = new Controller(); worden:
controller = new Controller(this);

Edit:
Buiten dit moeten er uiteraard nog EventHandlers voor de knoppen etc. toegevoegd worden, maar het is een begin ;)

[ Voor 21% gewijzigd door bvp op 13-04-2006 10:55 ]


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Inderdaard nu werkt het wel.

Mijn redenering was als volgt.

In dit stukje code moet een variabele komen te staan.
code:
1
set Font(new Font("MonoSpaced" ,controller.setfont(),16))

Nu dacht ik dus omdat Font.BOLD een stukje tekst is , ik dit als een String in mijn Controller class moest defineren.

Kan iemand mij uitleggen waarom dit dus een int moet zijn?Dan helpt mij weer een beetje opweg met het leren van JAVA.


Verder heb je het over eventhandlers voor de knopppen , dat is toch dit stukje code in mijn Controller class???
code:
1
2
3
4
5
6
7
8
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }


EDIT:
Ik geloof inderdaad dat de event nog niet opgevangen word :+
De variabele "bron" , blijft namelijk , na het clicken van een checkbox gewoon op "vet" , ik krijg dus geen ander lettertype tijdens het typen......

[ Voor 43% gewijzigd door degroot op 13-04-2006 11:38 ]

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 26-03 12:06

bvp

degroot schreef op donderdag 13 april 2006 @ 11:25:
Nu dacht ik dus omdat Font.BOLD een stukje tekst is , ik dit als een String in mijn Controller class moest defineren.

Kan iemand mij uitleggen waarom dit dus een int moet zijn?Dan helpt mij weer een beetje opweg met het leren van JAVA.
Font.BOLD is dus geen stukje tekst.
BOLD is de static variable van de class Font, die je dus rechtstreeks aan kunt roepen met Font.BOLD.
Op deze manier werkt de class Font deze variable af door intern het lettertype dus weer op "bold" te zetten.

Klik -> Kijk hier maar es voor Font
Verder heb je het over eventhandlers voor de knopppen , dat is toch dit stukje code in mijn Controller class???
code:
1
2
3
4
5
6
7
8
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }
Yep, dat klopt, althans het begin.
In de EventHandler moet je nu dus ook nog code toe gaan voegen dat de code in het textField dus ook veranderd -> bold, italic, understriped etc.

[ Voor 8% gewijzigd door bvp op 13-04-2006 11:54 ]


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
bvp schreef op donderdag 13 april 2006 @ 11:44:
Yep, dat klopt, althans het begin.
In de EventHandler moet je nu dus ook nog code toe gaan voegen dat de code in het textField dus ook veranderd -> bold, italic, understriped etc.
Haha ik dacht dat door de methode repaint dit gelijk zou moeten werken.....
IS dit moeilijk te realiseren , want ik zit met aardig grote denkfouten vermoed ik....(was php gewend, daar gaat alles zo simpel en gemakkelijk)

Maar ik defineer "bron" als een Object......
nu wil ik controleren welke knop is ingeklikt en dat doe ik doormiddel van hetvolgende
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    int setfont()
    {
        if(bron == vet)
        {
            return Font.BOLD;
        }
        else if(bron == cursief)
        {
            return Font.ITALIC;
        }
        else if(bron == onderstreep)
        {
            return Font.BOLD;
        }
    }

Alleen nu werkt dit niet , mijn compiler zegt
"Missing return statement" , dus het Object bron , krijgt dus niet de waarde van vet,cursief of onderstreep , want als ik de laaste else if(bron == onderstreep) vervang door alleen "else" , dan pakt hij altijd die waarde die in dat else statement staat.....

Moet ik Object bron eerst omzetten naar een String voordat deze gecontrolleerd kan wordne in mijn If constructie???

Haha sorry voor mijn lastige/verveelende/zeurende vragen , ben bezig met JAVA aan het leren uit het boek "En dan is er...JAVA"...Dit ter voorbereiding op volgend jaar(keuze gericht , en dan natuurlijk programmeren)

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20-05 21:10

Robtimus

me Robtimus no like you

degroot schreef op donderdag 13 april 2006 @ 11:55:
Alleen nu werkt dit niet , mijn compiler zegt
"Missing return statement" , dus het Object bron , krijgt dus niet de waarde van vet,cursief of onderstreep , want als ik de laaste else if(bron == onderstreep) vervang door alleen "else" , dan pakt hij altijd die waarde die in dat else statement staat.....
Jij weet dat bron alleen maar 1 van die waarden kan zijn. Wij weten dat. Maar de compiler weet dat niet.
Je moet dus ervoor zorgen dat er ALTIJD iets gereturned wordt*.Dus helemaal onderaan zet je een statement "return Font.PLAIN;".

De compiler wil gewoon dat er iets gereturned wordt in elke mogelijke theoretische vertakking in je code, in dit soort gevallen geef je dan maar een default "als er geen if geld dan maar dit" waarde terug.


* ff exceptions ignorend

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
IceManX schreef op donderdag 13 april 2006 @ 12:14:
[...]
De compiler wil gewoon dat er iets gereturned wordt in elke mogelijke theoretische vertakking in je code, in dit soort gevallen geef je dan maar een default "als er geen if geld dan maar dit" waarde terug.
Dit stukje van je verhaal is me compleet duidelijk , en logisch ook eigenlijk!

nu heb ik het dus zo opgelost
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    {
        if(bron == vet)
        {
            return Font.BOLD;
        }
        else if(bron == cursief)
        {
            return Font.ITALIC;
        }
        else
        {
            return Font.PLAIN;
        }
    }


Alleen loop ik nog op me eventhandler vast , hier kom ik niet echt aan uit ... zodra de checkbox is aangeklikt , moet er in mijn tekstvenster dus dat lettertype komen , dit werkt helaas nog niet
Mijn eventhandler ziet er dus zo uit
code:
1
2
3
4
5
6
7
8
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }

Ik dacht dat door de methode repaint(); bron de nieuwe waarde kreeg , en dus op het scherm automatisch het lettertype verandert...Maar darvoor moet nog het een en ander gebeuren neem ik aan?

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 26-03 12:06

bvp

Je moet er nu voor zorgen dat de TextArea (veld bij jou geloof ik) de veld.setFont(bold, italic etc.) meekrijgt.
And that's it ;)

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
klopt , de TextArea is bij mij "veld"
In het boek staat dus dat ik veld.setFont moet doen om het TextArea een ander lettertype mee te geven.
Als ik dat doe , dan wil dat niet werken.
Ook heb ik er op het einde een repaint(); aan gegeven.

Ik vermoed dus dat als ik op een Checkbox klik , dat de waarde van "bron" niet mee verandert.
zit ik hier juist?

Ik heb inmiddels nog wat zitten proberen waardoor mijn code er nu zo uitziet
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class test extends Applet
{
        private View view;
        private Controller controller;
        
        public void init()
        {
            setLayout(new BorderLayout());
            
            view = new View();
            controller = new Controller(view);
            
            add(view , BorderLayout.NORTH);
            add(controller , BorderLayout.SOUTH);
        }
}

class View extends Panel
{
    private TextArea veld;
    private Controller controller;
    private Font f;
    
    public View()
    {
        veld = new TextArea();
        controller = new Controller(this);
        add(veld);
        
        
        f = new Font("SansSerif",controller.setfont(),16);
        veld.setFont(f);
        repaint();
    }
}

class Controller extends Panel
{
    private CheckboxGroup driestand;
    private Checkbox vet , cursief , onderstreep;
    private View view;
    private Object bron;
    
    public Controller(View view)
    {
        this.view = view;
        driestand = new CheckboxGroup();
        
        vet = new Checkbox("vet" ,driestand , true);
        cursief = new Checkbox("cursief" , driestand , false);
        onderstreep = new Checkbox("onderstreep", driestand , false);
        
        Keuzehandler keuzehandler = new Keuzehandler();
        vet.addItemListener(keuzehandler);
        cursief.addItemListener(keuzehandler);
        onderstreep.addItemListener(keuzehandler);
        
        add(vet);
        add(cursief);
        add(onderstreep);
        
        bron = cursief;
    }
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }
    
    int setfont()
    {
        if(bron == vet)
        {
            return Font.BOLD;
        }
        else if(bron == cursief)
        {
            return Font.ITALIC;
        }
        else
        {
            return Font.PLAIN;
        }
    }
}


Ik vermoed dus dat het hier mis gaat:
code:
1
2
3
4
5
6
7
8
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            repaint();
        }
    }

Maar dat kan ik natuurlijk ook mis hebben.

[ Voor 8% gewijzigd door degroot op 13-04-2006 13:39 ]

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 26-03 12:06

bvp

Een manier om dit op te lossen is bijv. zo:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public class test extends Applet
{
        private View view;
        private Controller controller;
        
        public void init()
        {
            setLayout(new BorderLayout());
            
            view = new View();
            controller = new Controller(view);
            
            add(view , BorderLayout.NORTH);
            add(controller , BorderLayout.SOUTH);
        }
}

class View extends Panel
{
    private TextArea veld;
    private Controller controller;
    private Font f;
    
    public View()
    {
        veld = new TextArea();
        controller = new Controller(this);
        add(veld);
        
        
        f = new Font("SansSerif",Font.PLAIN,16);
        veld.setFont(f);
        repaint();
    }
    
    public TextArea getVeld() {
        return veld;
    }
}

class Controller extends Panel
{
    private CheckboxGroup driestand;
    private Checkbox vet , cursief , onderstreep;
    private View view;
    private Object bron;
    
    public Controller(View view)
    {
        this.view = view;
        driestand = new CheckboxGroup();
        
        vet = new Checkbox("vet" ,driestand , true);
        cursief = new Checkbox("cursief" , driestand , false);
        onderstreep = new Checkbox("onderstreep", driestand , false);
        
        Keuzehandler keuzehandler = new Keuzehandler();
        vet.addItemListener(keuzehandler);
        cursief.addItemListener(keuzehandler);
        onderstreep.addItemListener(keuzehandler);
        
        add(vet);
        add(cursief);
        add(onderstreep);
        
        bron = cursief;
    }
    class Keuzehandler implements ItemListener
    {
        public void itemStateChanged(ItemEvent e)
        {
            bron = e.getSource();
            setfont();
        }
    }
    
    void setfont()
    {
        TextArea field = view.getVeld();
        if(bron == vet)
        {
            field.setFont(new Font("SansSerif",Font.BOLD,16));
        }
        else if(bron == cursief)
        {
            field.setFont(new Font("SansSerif",Font.ITALIC,16));
        }
        else
        {
            field.setFont(new Font("SansSerif",Font.PLAIN,16));
        }
    }
}


Ik heb hier in de class View de method getVeld(){} toegevoegd om de TextArea op te halen.
De setFont heb ik geen return value meer gegeven (void) omdat dit niet logisch is. Een getBla() geeft iets terug, een setBla() heeft over het algemeen void.

In deze methode haal ik dus eerst jouw gebruikte TextArea op, hierna zet ik afhankelijk van de keuze de bold, italic etc.

Is ff snel naar de oplossing toegewerkt op deze manier, heb namelijk meer te doen op mijn werk hier ;)

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Hmmm toch bedankt voor al je moeite maar ook op jouw manier wil mijn lettertype niet veranderen.

Ook vond ik mijn manier een stukje duidelijker , omdat ik nu niet helemaal kan volgen waar void setFont()
{
//de inhoud van de code
}
voor staat..
En ook Public TextArea getVeld(); is me ook beetje onduidelijk(zal vast allemaal komen omdat ik het niet zelf geprogrammeerd heb)

Msschien dat iemand mij weer een beetje opweg kan helpen???
Ik kan nu door de bomen(fouten) het bos(code) niet meer vinden....

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 26-03 12:06

bvp

degroot schreef op donderdag 13 april 2006 @ 15:56:
Hmmm toch bedankt voor al je moeite maar ook op jouw manier wil mijn lettertype niet veranderen.
Heb hem hier getest en werkt wel gewoon hoor, beetje buggy maar hij werkt.
Typ maar es een stuk tekst, en verander daarna naar italic en vet. Understriped werkt alleen niet, door die laatste else{}. De understriped is nl. niet gedefinieerd hier.
Ook vond ik mijn manier een stukje duidelijker , omdat ik nu niet helemaal kan volgen waar void setFont()
{
//de inhoud van de code
}
voor staat..
void staat voor GEEN return waarde.
Je had int setfont() {} die MOET dus ALTIJD iets teruggeven van het type int.
Dit is niet logisch als je setfont gebruikt. Bij een set verwacht je nl. meestal geen return waarde.
Zodoende dat ik jouw textArea veld rechtstreeks aanspreek in de method void setfont() {}
En ook Public TextArea getVeld(); is me ook beetje onduidelijk(zal vast allemaal komen omdat ik het niet zelf geprogrammeerd heb)
public TextArea getVeld(); geeft jouw gedefinieerd veld terug aan bijv. een andere class als je daar om vraagt.

public: public staat voor dat je hem in elke andere class kunt aanroepen.
TextArea: deze method geeft het type TextArea terug.
getVeld: naam van de method -> geef het beestje maar een naam ;)

Deze method roep ik dus aan in getfont() {} met:
TextArea field = view.getVeld();
Hier haal ik dus jouw gedefinieerde textArea op uit de class View.

Deze gebruik ik vervolgens om van deze textArea het font te veranderen met:
field.setFont(new Font("SansSerif",Font.BOLD,16));

Hier wijst field dus naar de opgehaalde TextArea (veld) uit de class View.

Anders misschien leuk/handig om naar onderstaande cursus te kijken, deze behandelt de beginselen van Java op elk vlak een beetje ;)

http://www.ster.be/java/

Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Je code werkt inderdaad!
Had het getest als volgt: stukje tekst type , checkbox aanklikke en verder type...dan doet mijn code het inderdaad nog niet....
Als je de tekst selecteerd dan werkt de code wel , alleen dat was niet helemaal mijn bedoeling....

Ik ben bezig met JAVA leren vanuit een boek , ben nu bij hoofdstuk 14 van de 19 maar echt veel van snappen doe ik het nog niet (daarom verzin ik net als dit , zelf voorbeeldjes om te maken)

Ik ga nu naar huis , had graag nog even verder willen proberen maar heb vanavond een druk schema...
Dat word dus morgenvroeg op het werk weer verder spelen , ik zal je even laten weten als ik er hier aan uit kom

Alvast bedankt!!!

www.degroot-it.nl

Pagina: 1