Toon posts:

[java] resize scherm?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb iin een JAVA applicatie een functie gemaakt die een scherm opbouwd. Als ik deze functie aanroep doet ie het op zich wel,
maar het probleem is dat je in eerste instantie niks ziet (knoppen die geplaatst moeten worden), pas als je het scherm resized komen de knoppen op de plaats te staan waar ze horen.

dit is de functie:
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
public void paintFrame(){
        AANTAL_BUDDIES = nThread.buddies.size();

        // scherm indeling maken
        getContentPane().add(buddyScroll);
        buddyPanel.setLayout(new BoxLayout(buddyPanel,BoxLayout.Y_AXIS));
        buddyPanel.setBackground(Color.gray.brighter());
        buddyScroll.getViewport().add(buddyPanel);

        FlowLayout searchFL = new FlowLayout();
        searchPanel.setLayout(searchFL);
        searchFL.setHgap(0);
        getContentPane().add(BorderLayout.SOUTH,searchPanel);
        //searchPanel.setHgap(0);

        //buddie-buttons op t scherm plaatsen
        ba = new ButtonArray(nThread);
        ba.placeButtons(this);

        // main menu
        mainMenu.setText("Main");
        mainMenu.setForeground(Config.ownColor);
        mainMenu.setActionCommand("Main");
        mainMenu.setMnemonic((int)'M');
        JMenuBar1.add(mainMenu);

        // edit menu items
        prefItem.setText("Preferences");
        prefItem.setForeground(Config.ownColor);
        prefItem.setActionCommand("Preferences");
        prefItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK));
        prefItem.setMnemonic((int)'P');
        mainMenu.add(prefItem);

        // help menu
        helpMenu.setText("Help");
        helpMenu.setForeground(Config.ownColor);
        helpMenu.setActionCommand("Help");
        helpMenu.setMnemonic((int)'H');
        JMenuBar1.add(helpMenu);

        // help menu items
        aboutItem.setText("About...");
        aboutItem.setForeground(Config.ownColor);
        aboutItem.setActionCommand("About...");
        aboutItem.setMnemonic((int)'A');
        helpMenu.add(aboutItem);
}

In ButtonArray wordt, zoals het je doet vermoeden :P, een array met buttons gemaakt en die worden geplaatst...

Het gekke is dat als je het scherm resized (maar een klein beetje al) dan heb ik precies het effect wat ik wil. Maar ik wil daarvoor dus niet te hoeven resizen!

:'(

iemand een idee wat er fout gaat.
(mrBravenboer waarschijnlijk wel weer :P)

  • xillius
  • Registratie: November 2001
  • Laatst online: 23-01-2022
ehm...
misschien voordat je het scherm "tekent" de methode setSize() aanroepen en hier de juiste grootte in meegeven

dus MainMenu.setSize(400,400);

zoiets

  • TrendKiller
  • Registratie: Januari 2001
  • Laatst online: 02-07 13:03
Roep op het einde van je funtie repaint() eens op

Verwijderd

Topicstarter
Jah ik wil alleen dan wel de size hebben die het scherm op dat moment heeft.

en repaint(), met een applicatie?? ik gebruik deze functie als ik de frame wil tekenen of hertekenen, dus repaint() lijkt me niet nodig

  • TrendKiller
  • Registratie: Januari 2001
  • Laatst online: 02-07 13:03
Dan kan je de methode pack() oproepen. Deze zorgt daarvoor

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je moet je frame even packen als je alle componenten hebt toegevoegd: het frame neemt dan de preferred size van de componenten aan. Hierbij wordt dus gebruik gemaakt van layout-managers.

Je kunt dit doen met de 'pack' methode :) .

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


Verwijderd

Topicstarter
(daar istie dan, de langverwachte.... ;))

Dat pack() werkt heel goed voor mn eerste probleem.

Nu is het alleen zo dat als je het scherm resized, en je deze functie aanroept, dan neemt ie de grootte van de preferred size, maar als ie is geresized moet ie de grootte geven van het scherm op dat moment.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Sh4keM: Dat pack() werkt heel goed voor mn eerste probleem.
Mooi :) .
Nu is het alleen zo dat als je het scherm resized, en je deze functie aanroept, dan neemt ie de grootte van de preferred size, maar als ie is geresized moet ie de grootte geven van het scherm op dat moment.
Als het scherm wordt geresized moet je ook niet pack aanroepen: pack maakt de size van een frame de preferred size van de componenten in het frame. Als de gebruiker resized moet je gewoon de layout-mananger z'n werk laten doen: als je deze goed gebruikt hoef je helemaal niets bijzonders te doen en passen de componenten zich zelf aan aan de nieuwe frame-size :) .

In principe heb je dus geen probleem ;) . Bij een resize door de gebruiker (of een programma-matige setSize) hoef je helemaal niets te doen. Als de componenten zich niet goed aanpassen, moet je je layout-managers anders gebruiken...

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


Verwijderd

Topicstarter
nee ik bedoel het anders.

Er zijn een aantal componenten (buttons) in de frame die kunnen veranderen (van kleur bv.) Als deze veranderen in de ButtonArray dan roep ik die functie paintFrame() aan.

als ik daar dus pack() gebruik dan neemt ie dus niet de size aan die het frame op dat moment heeft, maar de preferred size...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Sh4keM: Er zijn een aantal componenten (buttons) in de frame die kunnen veranderen (van kleur bv.) Als deze veranderen in de ButtonArray dan roep ik die functie paintFrame() aan.
Ah.... waarom verander je dan niet gewoon de button die er al stond? Misschien is het onnodig om steeds nieuwe componenten aan te maken?

Maar goed, als je dat niet wilt is er nog wel een oplossing :) .

Pack doet namelijk dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void pack() {
    Container parent = this.parent;
    if (parent != null && parent.getPeer() == null) {
        parent.addNotify();
    }
    if (peer == null) {
        addNotify();
    }
    setSize(getPreferredSize());
    isPacked = true;

    validate();
    }
als ik daar dus pack() gebruik dan neemt ie dus niet de size aan die het frame op dat moment heeft, maar de preferred size...
Waarschijnlijk helpt 'validate' je dus in dit geval :) . Zie de api docs voor uitleg. Er is ook nog een doLayout, maar die kan je beter niet gebruiken.

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


Verwijderd

Topicstarter
Ik kan inderdaad niet alleen de Button veranderen, want het gaat om online/offline komen van buddys (chatprog dus :)) net zoiets als MSN en ICQ, online mensen boven en offline mensen onder...

Ah, ik duik die API wel weer ff in.

Bedankt! :)
Pagina: 1