Toon posts:

[JAVA] JButton zonder LayoutManager wil niet?

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

Verwijderd

Topicstarter
Ik ben bezig met een applicatie en zou daar graag wat buttons in willen zetten :) Het is voor het eerst dat ik met Swing aan de gang ga en mijn eerste probleem was dus al het volgende...

Zodra ik de layout van mijn JPanel op null zet:

this.setLayout(null);

En ik vervolgens een knop wil toevoegen:
code:
1
2
3
4
5
6
    pButton = new JButton("<html><font size=-1><b><u>D</u>isable</b></font>");
    pButton.setVerticalTextPosition(AbstractButton.CENTER);
    pButton.setHorizontalTextPosition(AbstractButton.CENTER);
    this.add(pButton);
    pButton.addActionListener(this);
    pButton.setBounds(40, 30, 80, 30);

Dan komen er geen fouten maar de knop komt ook niet in beeld... Bij normale AWT buttuns heeft dit altijd wel gewerkt, ik heb nog validate() geprobeerd na wat zoeken in de api maar dat helpt niets...

Zodra ik gewoon een flowLayout gebruik of grid of whatever werken de knoppen wel, nu is dus de vraag kun je alleen knoppen op het scherm tonen als je gebruik maakt van een layout manager? Dit lijkt me best sterk, maar kan niets anders verzinnen...

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

nee moet ook wel zonder manager kunnen, dan heb je gewoon je eigen indeling.

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Topicstarter
Ja maar heb je enig idee waar ik iets fout doe dan?

Wat zou ik nog extra toe moeten voegen om me knoppie te laten zien ;) Bij awt is een setBounds voldoende... Maar in Swing?

Verwijderd

|:( Hier stond een typisch antwoord van iemand die de vraag half leest.

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op woensdag 27 februari 2002 17:47 schreef Albino het volgende:
Ja maar heb je enig idee waar ik iets fout doe dan?
...
Nee sorry het is te lang geleden... maar er zitten genoeg Javahova's hier die dat wel kunnen vertellen :)

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


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

Alarmnummer

-= Tja =-

Je krijgt toch een foutmelding als je rechtstreeks iets toevoegt aan een JFrame (ipv zijn content pane)?

Anders moet je even kijken naar de XYLayout van JBuiler als e echt vast wilt zitten aan een fixed scherm. Ik heb die XYLayout eruit gesloopt en een losse jar ervan gemaakt.

Maar na een tijdje wil je echt niet meer vast zitten aan fixed schermen :) en ga je echt wel over op een layoutManager. Lijkt me het handigste als je er meteen mee begint.

En wat ziet mijn oog daar? een addActionListener(this)? ieeeekkksss :)


opl.
code:
1
2
3
4
5
6
7
8
class PButtonListenerImpl implements ActionListener{
   public void actionPerformed(ActionEvent ae){
     System.out.println("<html><font size=-1><b><u>D</u>isable</b></font>");
   }
}

JButton pButton = new JButton();
pButton.addActionListener(new PButtonListenerImpl());

Ga nooit een JFrame ofzo voorzien van een implements ActionListener maar maak even een interne klasse die per object die een action kan veroorzaken (dus in jouw geval per button) even een eigen actionlistenerimpl heeft. Je hoeft dan ook niet meer achteraf uit te zoeken welke knop is ingedrukt. En ander nadeel is dat je eventueel een reeds bestaande public void actionPerformed(ActionEvent ae) override en die niet meer uitgevoerd word terwijl hij wel nodig was voor het correct functioneren van dat component.

Je kan trouwens ook werken met een AbstractAction (doe ik zelf altijd)
code:
1
2
3
4
5
6
7
8
9
10
11
class PButtonAction extends AbstractAction{
   public PButtonAction(){
     super("<html><font size=-1><b><u>D</u>isable</b></font>"); 
   }

   public void actionPerformed(ActionEvent ae){
    System.out.println("raak me niet aan"):
   }
}

JButton pButton = new JButton(new PButtonAction());

En nu zul je jezelf afvragen waar dit nou weer goed voor is. Heel simpel: je kan nu meerdere componenten (Toolbar buttons en menuItem bv laten luisteren naar dezelfde action). En als jij bijvoorbeeld een editor hebt en er is geen file actief dan is het ook niet nodig om te kunnen saven, je kan dan zeggen: saveAction.setEnabled(false);

hierdoor vallen meteen alle componenten die naar die actionLuisteren gedisabled.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Laat eens wat meer code zien? Uit dit fragement kan ik niet zo 123 afleiden wat er mis is...

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


Verwijderd

Topicstarter
Ok zoals ik al zei ik probeer de knopjes op een JPanel te zetten dus nee ik krijg geen error dat ik ze direct op een Frame wil zetten...

Ik zal eerst even de opzet van het programma vertellen... Ik heb een class waarin mijn main zit, deze maakt een instantie van de class frame.java, deze extends een Frame (geen JFrame) hier maak ik een instantie voor de class gui.java (daar moeten de knoppen op komen) deze extends JPanel. Dze bevat nog twee classes maar die vormen hier het probleem niet... Aangezien ik die wel goed in beeld krijg :?

De code van de gui class :
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
package audio;

import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.AbstractButton;

public class gui extends JPanel implements ActionListener {

  private audioClipPlayer myWinAmp;
  private background myBackGround;
  protected JButton pButton, lButton, sButton;

  public gui(int x, int y, int width, int height) {

    this.setLayout(null);
    this.setBounds(x, y, width, height);
    this.setBackground(new Color(0, 0, 0));

    myWinAmp = new audioClipPlayer(0);

    this.add(myWinAmp);
    myWinAmp.setBounds(40, 70, 200, 25);

    pButton = new JButton("<html><font size=-1><b><u>D</u>isable</b></font>");
    pButton.setVerticalTextPosition(AbstractButton.CENTER);
    pButton.setHorizontalTextPosition(AbstractButton.LEFT);
    this.add(pButton);
    pButton.addActionListener(this);
    pButton.setBounds(40, 30, 80, 30);

    lButton = new JButton("Loop");
    this.add(lButton);
    lButton.addActionListener(this);
    lButton.setBounds(120, 30, 40, 30);

    sButton = new JButton("Stop");
    this.add(sButton);
    sButton.addActionListener(this);
    sButton.setBounds(200, 30, 40, 30);

    myBackGround = new background();
    this.add(myBackGround);
    myBackGround.setBounds(0, 0, 280, 110);

  //  this.invalidate();
  //  this.doLayout();
 }

 public void newClip(String myPath) {
   myWinAmp.newClip(myPath);
 }

  public void actionPerformed(ActionEvent event){

    if(event.getSource() == pButton){
    myWinAmp.play();
    }

    if(event.getSource() == lButton){
    myWinAmp.loop();
    }

    if(event.getSource() == sButton){
    myWinAmp.stop();
    }
  }
}

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

Alarmnummer

-= Tja =-

Je moet Swing niet met AWT gaan combineren (dat is jouw probleem denk ik). Het is het een of het is het ander.
Maak van die Frame maar eens een JFrame en doe dit even met constructor:
code:
1
2
3
4
5
6
7
8
9
public Gui(int .....){
   Container contentPane = getContentPane();
   contentPane.setLayout(null); 

   ....
   pButton = new JButton("bladibla");
   contentPane.add(pButton);
   ....
}

En een regel bij java is om alle classes met hoofdletter te laten beginnen, in jou geval Gui. En het is java ook gebruikelijk om niet meerde variable declaties achter elkaar te zetten.

ps: probeer geen zeurkous te zijn, maar je een paar goeie tips te geven ;)

Verwijderd

Topicstarter
En een regel bij java is om alle classes met hoofdletter te laten beginnen, in jou geval Gui.
Oops das een foutje jah :) ik ken de regel :9
En het is java ook gebruikelijk om niet meerde variable declaties achter elkaar te zetten.
Hoe bedoel je dit?
ps: probeer geen zeurkous te zijn, maar je een paar goeie tips te geven ;)
Haha idd, zo neem ik het ook op hoor :) Kan namelijk nergens anders terecht met me java probleempjes dus ben blij dat jullie er zijn :)

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

Alarmnummer

-= Tja =-

hoe bedoel je dit?
geen:
int a, b, b;

maar
int a;
int b;
int c;

Je krijgt hierdoor veel beter overzicht en je kan ook heel eenvoudig documenteren.

En wat ik de laatste tijd op over ben gestapt is het volgende:
code:
1
2
3
4
5
6
7
8
class Persoon{
  private int m_leeftijd;

  public void setLeeftijd(int leeftijd){
     m_leeftijd = leeftijd; 
  }
  
}

Je kunt nu beter zien wat variablen van de methode zijn en variablen van de class. En die m_ komt van member (is variable van de classe (of eigelijk van de instantie voor de miereneukers onder ons)).

Verwijderd

Topicstarter
Hmm ja ik zie en snap je argumenten, toch vreemd omdat ik mede de voorbeelden van Sun gebruik om mijn Java kennis op te spijkeren en die grebruiken ook de methode van

int a, b, c;

Kzal jou manier ook eens gaan testen :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Albino: toch vreemd omdat ik mede de voorbeelden van Sun gebruik
Nobody's perfect en in het bijzonder Sun niet ;) .

Ik gebruik zelf trouwens ook een member toevoeging voor instantie-variabelen, maar dan alleen _ . Dit is een opkomende coding standard die je onder andere terug ziet in het boek 'Refactoring' van Martin Fowler.

Dat gevalsonderscheid in je ActionListener over je buttons is trouwens ook niet zo mooi ;) .

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


Verwijderd

Topicstarter
Container contentPane = getContentPane();
contentPane.setLayout(null);
Dit kan ik niet in de JPanel zijn constructor toevoegen aangezien getContentPane() geen methode is van JPanel... Toch?

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

Alarmnummer

-= Tja =-

Op woensdag 27 februari 2002 18:35 schreef Albino het volgende:

[..]

Dit kan ik niet in de JPanel zijn constructor toevoegen aangezien getContentPane() geen methode is van JPanel... Toch?
Nope :) daar mag je rechtsteeks toevoegen, maar aan een JFrame heb je deze constructie wel nodig.

Verwijderd

Topicstarter
Op woensdag 27 februari 2002 18:39 schreef Alarmnummer het volgende:

[..]

Nope :) daar mag je rechtsteeks toevoegen, maar aan een JFrame heb je deze constructie wel nodig.
Yup dan had je het net ff verkeerd gequote ;)

Ik heb nu van mijn Frame een JFrame gemaakt en met getContentPane() daar de Gui op toegevoegd... Maar nog steeds zonder suc6 :'( De achtergrond komt wel weer in beeld, samen met het player-object uit de die ik heb gemaakt met behulp van JMF (deze komen beide uit aparte classes en worden toegevoegd aan Gui) maar de buttons blijven nog steeds weg...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Nog een kleine tip:
code:
1
2
public gui(int x, int y, int width, int height) {
    this.setLayout(null);

Je kunt beter gelijk aan een JPanel de layout meegeven. Anders wordt er namelijk een default layout aangemaakt, die daarna weer vervangen wordt door je eigen layout (in dit geval null). Kost allemaal onnodige object creatie en dus is het handig om altijd gelijk mee te geven wat je wilt aan je constructor. Het wordt dan dus dit:
code:
1
2
public gui(int x, int y, int width, int height) {
    super(null);

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


Verwijderd

Topicstarter
Hmmz ik ben er al uit...

Dit was gewoon stom! :( Ik had de achtergrond later toegevoegd als de knoppen! Logische komt die dan ook voor de knoppen te zitten :( Daardoor waren de knoppen dus weg...

Maar ja het werk nu dus :) Thnx voor alle hulp heb toch weer een paar leuke dingen geleerd, ga straks even wat rommmelen met die actionListener zoals jullie zeiden :)

Verwijderd

Topicstarter
Kan dat zo ->
code:
1
2
public gui(int x, int y, int width, int height) {
    super(null);

Dat moet dan toch worden super.setLayout(null) of begrijp ik het nu verkeerd?

Verwijderd

Met super() roep jeje superklasse aan en aangezien je van een JPanel extend kun je dus super(null) gebruiken. Je gebruikt dus eigenlijk de constructor JPanel(LayoutManager layout)
Mmmm ik weet niet of dit echt duidelijk is.
Pagina: 1