[JAVA] extra grafisch venster openen

Pagina: 1
Acties:

  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
Hoe kan ik vanuit een klasse die een grafisch venster aanmaakt, een ander venster aanmaken,
bijvoorbeeld dat als je op de sendButton klikt, dat hij zichzelf dan nog een keer opent (zie commentaar)
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
import java.awt.*;
import java.awt.event.*;

public class createMail extends Frame implements ActionListener{
  
  TextField toField,fromField,messageField;
  Button sendButton,resetButton,backButton;

 public createMail(){
    super("E-mail Composer");
    setLayout(new BorderLayout());

    Panel p = new Panel();
    p.add(sendButton    = new Button("Send"));
    p.add(resetButton  = new Button("reset"));
    p.add(backButton  = new Button("Go Back"));
    add(p, "South");

    Panel n = new Panel();
    n.setLayout(new FlowLayout());
    n.add(/*20, 10, 40, 8, */new Label("From:"));
    n.add(/*70, 10, 200, 8, */fromField  = new TextField(30));
    n.add(/*20, 40, 40, 8, */new Label("To:"));
    n.add(/*70, 40, 200, 8, */toField    = new TextField(30));
    pack();
    add(n, "North");

    add(messageField = new TextField(40), "Center");

    setBackground(Color.lightGray);
    pack();
    setBounds(100, 100, 400, 400);
    setVisible(true);
    addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        close();
      }
    });
  }


  private void add(int x, int y, int w, int h, Component comp)
  {
    comp.setBounds(x, y, w, h);
    add(comp);
  }

  private void close()
  {
    System.exit(0);
  }

  public void actionPerformed(ActionEvent e){
    if(e.getSource() == sendButton){
    //HIER MOET HIJ ZICHZELF NOG EEN KEER AANMAKEN
    //ALLEEN MAAR BIJ WIJZE VAN TEST
    //al ik:
    //new createMail();
    //doe, dan werkt het namelijk niet...
     }
  }
}

thnx!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zou gewoon moeten werken.... show je hem wel?

Overigens is de klassenaam erg ongelukkig: het is erg standaard om klassenamen met een hoofdletter te schrijven en bovendien klopte het werkwoord in de klassenaam niet echt. Het zou misschien beter een zelfstandig naamwoord kunnen zijn zoals SendMailFrame oid :) .

Tip: schrijf je GUIs nooit in een Frame of een Dialog, want dan zit je vast aan dat window soort. Beter kan je je GUI als een Panel schrijven.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
ehm,
kan je dat misschien uitleggen?
Ik ben namelijk nog niet zo thuis in Java :)

Ik gebruik in mijn file hierboven wel een panel,
bedoel je dat soms?

thnx!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Zou gewoon moeten werken.... show je hem wel?
voor de duidelijkheid..
code:
1
2
3
4
5
6
 public void actionPerformed(ActionEvent e){
    if(e.getSource() == sendButton){
       createMail _createMail = new createMail();
       _createMail.show();
    }
  }

[edit] foutje.. waar worden variablen die beginnen met underscores voor gebruikt? zie ze vaak bij statische variablen.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je extend je mail userinterface nu van Frame. Daardoor kan je hem nooit meer in een Dialog of een Window gebruiken. Je gebruikt in dit geval dus inheritance.

Maar eigenlijk wil je gewoon een paneltje maken met wat knopjes erin. Daarom kan je je mail userinterface ook gewoon extenden van een Panel. Je kan je knopjes dan gewoon toevoegen aan dit Panel.

Onafhankelijk van het mail panel kan je daarna je userinterface in een Frame, Window of Dialog stoppen :) . Hierdoor gebruik je een soort delegatie. Met inheritance moet je altijd een beetje uitkijken. In veel gevallen kan je beter delegatie gebruiken :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
zou je misschien ff wat kunnen versleutelen aan mijn voorbeeld zodat het wordt wat jij bedoeld??
ik snap er namelijk nogal weinig van :)
Am still learning :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum, vooruit dan ;) .

Je was trouwens in je bovenstaande code ook vergeten om ActionListeners aan de knoppen te hangen.

Dit hier werkt aardig. Ik heb in de code commentaar gezet. Kijk het ff goed door, want ik kwam nogal wat raars tegen ;) . Als je iets niet snapt moet je daar maar ff specifieker naar vragen.
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.awt.*;
import java.awt.event.*;

// Hoofdletter voor klassenaam
public class SendMailPanel extends Panel
{
    // Gebruik 1 declaratie per regel

    private TextField toField;
    private TextField fromField;
    private TextField messageField;

    private CloseAction closeAction;

    public SendMailPanel(Window window)
    {
        super(new BorderLayout());

        // assignments als parameter (expressie ) gebruiken 
        // is niet mooi -> aparte assignments

        Button sendButton   = new Button("Send");
        Button resetButton  = new Button("reset");
        Button backButton   = new Button("Go Back");

        closeAction = new CloseAction(window);

        // vergeet niet je ActionListeners ook toe te voegen!
        sendButton.addActionListener(new SendAction());
        resetButton.addActionListener(new ResetAction());
        backButton.addActionListener(new GoBackAction());

        Panel p = new Panel();
        p.add(sendButton);
        p.add(resetButton);
        p.add(backButton);

        // Gebruik geen "South" maar BorderLayout.SOUTH

        add(BorderLayout.SOUTH, p);

        fromField = new TextField(30);
        toField   = new TextField(30);
        // hum, dit wil je later vast een TextArea maken?
        messageField = new TextField(40);
            
        Panel n = new Panel();
        n.setLayout(new FlowLayout());
        n.add(new Label("From:"));
        n.add(fromField);
        n.add(new Label("To:"));
        n.add(toField);
    
        // pack is hier niet zinvol omdat nog niet al je
        // componten zijn geplaatst
        // pack();
        
        // Ook hier weer BorderLayout.NORTH ipv "North"

        add(BorderLayout.NORTH, n);
        add(BorderLayout.CENTER, messageField);

        setBackground(Color.lightGray);

        // beter: laat de layout-manager zijn werk doen:
        // gebruik daarom pack() bij een Window.
        //    setBounds(100, 100, 400, 400);
        
        // Visible maken in een constructor is niet handig
        // en in dit geval ook niet meer mogelijk (panel).
        //setVisible(true);
    }

    // dit is ff een makkelijke methode om een Frame te maken
    public static Frame createFrame()
    {
        Frame frame = new Frame("E-mail composer");
        SendMailPanel panel = new SendMailPanel(frame);

        frame.addWindowListener(panel.getCloseAction());
        frame.add(panel);
        frame.pack();

        return frame;
    }

    //entry point, gewoon om ff te testen
    public static void main(String[] ps)
    {
        Frame frame = createFrame();
        frame.show();
    }
    
    public CloseAction getCloseAction()
    {
        return closeAction;
    }

    // liever aparte ActionListeners dan gevalsonderscheid in 1 ActionListener

    class CloseAction extends WindowAdapter implements ActionListener
    {
        private Window window;

        public CloseAction(Window window)
        {
            super();
            this.window = window;
        }

        public void windowClosing(WindowEvent e)
        {
            window.dispose();
      }

        public void actionPerformed(ActionEvent event)
        {
            window.dispose();
        }
    }

    class SendAction implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            // doe iets
        }
    }

    class ResetAction implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            // doe iets
        }
    }

    class GoBackAction implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            // doe iets
        }
    }
}

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Goh, ik kon trouwens nog AWT proggen :P ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Zynth
  • Registratie: September 2001
  • Laatst online: 29-07 15:30
ik heb nog 1 vraagje;

Als ik nou met de main-functie hierboven een venster aanmaak, hoe kan ik dat venster dan sluiten door op de gobackButton te drukken?

thnx!
Pagina: 1