Toon posts:

[Java] Grote lijst variabelen inkorten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een beetje vage titel..

Maar het volgende is aande hand:

Ik heb een programma waarin een grote lijst met kanelen wordt weergegeven, waarbij elke kanaal een checkbox heeft met een bepaalde functie erachter. De namen van deze checkboxes gaan van ch1 t/m ch100 (en evt. nog verder)..

Nu is dat nogal een lap tekst om te declareren en in te voeren.. Is er een mogelijkheid om dit op één of andere manier in een for-lus te doen, waarbij die hele lijst dus in één keer wrodt gedeclareerd (met andere bijbehorende handelingen)..

Heb het geprobered met de volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
JCheckBox[] logCheck;

for(int j=0; j<aantal; j++)
        {
            logCheck[j] = new JCheckBox(iconLogFalse, false);
            logCheck[j].addItemlistener(this);
            logCheck[j].setBounds(325, y, 22, 18);
            y = y + 20;
            add(logCheck[j]);
        }


Hij geeft hier bij regel 6 (de itemlistener) de volgende foutmelding:
code:
1
2
3
4
5
6
MainPanel.java:317: cannot find symbol
symbol  : method addItemlistener(MainPanel)
location: class javax.swing.JCheckBox
            logCheck[j].addItemlistener(this);
                                ^
1 error

Maar als ik die regel disable, dan compileert hij wel goed, maar krijg dan bij het runnen de volgende foutmelding:
code:
1
2
3
4
5
Exception in thread "main" java.lang.NullPointerException
    at MainPanel.setLogCheckboxes(MainPanel.java:316)
    at MainPanel.<init>(MainPanel.java:84)
    at MainFrame.<init>(MainFrame.java:20)
    at MainApp.main(MainApp.java:7)


Iemand een idee wat ik hieraan kan doen?

  • Apie!
  • Registratie: Januari 2000
  • Laatst online: 09-03 19:55

Apie!

Newer, better & confusinger

Ik zie het nergens staan, maar doe je wel ergens iets als
code:
1
JCheckBox[] logCheck = new JCheckBox[aantal] ;

My lungs taste the air of Time
Blown past falling sands


Verwijderd

Topicstarter
Stom.. je hebt gelijk.. ik had dus alleen:
Java:
1
JCheckBox[] logCheck; 


Maar toch lost dat nog niet alles op, want ik krijg het niet voor elkaar om in die for-lus de ItemListener toe te voegen. Hij blijft dan die foutmelding (zie beginpost) geven bij het compileren..

Edit:
Want het zal dan ook lastig worden om met de itemStateChanged() methode de events van al deze checkboxes op te vangen. Zou daarom die ItemListener niet toegevoegd kunnen worden?

[ Voor 26% gewijzigd door Verwijderd op 26-04-2005 13:46 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Met this wijs je naar je eigen class. Implementeert deze wel de ItemListener interface? Want de compilatie foutmelding lijkt erop te wijzen dat de compiler dit niet kan afleiden.

Verwijderd

Topicstarter
ik heb heb de code in een methode ( public void setLogCheckboxes() ) staan, die ik in de hoofdclass aanroep. en deze class implementeert wel die ItemListener.. want als ik handmatig een lijst met checkboxes maak in deze methode gaat alles wel goed..

hij lijkt dus problemen te hebben met het array (??)

Verwijderd

addItemListener , met hoofdletter I en L dus

Verwijderd

Topicstarter
|:(

Tnx iig.. het werkt nu..

Voor de geïnteresseerden:
Ik heb nu de volgende code voor het 'afluisteren' van de events
Java:
1
2
3
4
5
6
7
8
9
10
11
public void itemStateChanged(ItemEvent ev) 
  {     
    for(int i=0;i<=aantalCheckLog; i++)
    {
        if(ev.getSource() == checkLog[i])
        {
            if(ev.getStateChange() == ItemEvent.DESELECTED) { checkLog[i].setIcon(iconLogFalse);labelLog[i].setText("Off"); }
            else { checkLog[i].setIcon(iconLogTrue);labelLog[i].setText("Logging..."); }            
        }
    }   
  }

  • wibra
  • Registratie: Januari 2005
  • Laatst online: 04-02 19:35
kijk in het vervolg eens goed naar de foutmelding van je compiler. ik ben ook maar student, maar heb toch al geleerd dat het niet altijd cryptisch hoeft te zijn. er stond zelfs een pijltje onder de l van listener...

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 07-05 19:18

Robtimus

me Robtimus no like you

Tip: set een break in die if statement:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
public void itemStateChanged(ItemEvent ev) 
  {     
    for(int i=0;i<=aantalCheckLog; i++)
    {
        if(ev.getSource() == checkLog[i])
        {
            if(ev.getStateChange() == ItemEvent.DESELECTED) { checkLog[i].setIcon(iconLogFalse);labelLog[i].setText("Off"); }
            else { checkLog[i].setIcon(iconLogTrue);labelLog[i].setText("Logging..."); }            
            break;
        }
    }   
  }
Dan stopt hij met de loop zodra je je checkbox hebt gevonden.

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


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

kun je niet gewoon:
Java:
1
2
3
4
5
6
7
8
public void itemStateChanged(ItemEvent ev)
{
  if (ev.getSource() instanceof JCheckBox)
  {
    JCheckBox cb = (JCheckBox)ev.getSource();
    // rest handelingen hier
  }
}


bespaart je die for lus...

edit: CheckBox => JCheckBox

[ Voor 7% gewijzigd door H!GHGuY op 26-04-2005 18:58 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
die laatste optie wordt vrij lastig denk ik, omdat er aan die checkbox nog een aantal variabelen hangen, die op dezelfde manier (ook zo'n array) zijn opgebouwd.. en aangezien ik via deze manier niet weet op welke positie in de array hij zit, kan ik dus die andere variabelen ook niet aanspreken..

of is er een manier om erachter te komen op welke index hij zit??

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 08:30
Kan je JCheckBox niet gewoon overerven, en uitbreiden met extra gegevens?

Verwijderd

Topicstarter
schoene schreef op woensdag 27 april 2005 @ 09:19:
Kan je JCheckBox niet gewoon overerven, en uitbreiden met extra gegevens?
Hoe bedoe je dat??

  • Apie!
  • Registratie: Januari 2000
  • Laatst online: 09-03 19:55

Apie!

Newer, better & confusinger

hij bedoelt: een eigen class maken die JCheckBox extends. Aan die class kan je dan je eigen variabelen en methods toevoegen.
Verwijderd schreef op dinsdag 26 april 2005 @ 13:52:
addItemListener , met hoofdletter I en L dus
Is het om dit soort tiepvauten te voorkomen niet handiger om Eclipse oid te gebruiken?

[ Voor 56% gewijzigd door Apie! op 27-04-2005 10:22 ]

My lungs taste the air of Time
Blown past falling sands


  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:25

momania

iPhone 30! Bam!

Verwijderd schreef op woensdag 27 april 2005 @ 09:06:
die laatste optie wordt vrij lastig denk ik, omdat er aan die checkbox nog een aantal variabelen hangen, die op dezelfde manier (ook zo'n array) zijn opgebouwd.. en aangezien ik via deze manier niet weet op welke positie in de array hij zit, kan ik dus die andere variabelen ook niet aanspreken..

of is er een manier om erachter te komen op welke index hij zit??
Je zou het ActionCommand kunnen vullen met de index.:
Java:
1
logCheck[j].setActionCommand(String.valueOf(j));

Die kan je dan in je eventHandler gewoon uitlezen:
Java:
1
2
3
4
5
6
7
8
public void itemStateChanged(ItemEvent ev)
{
  if (ev.getSource() instanceof JCheckBox)
  {
    JCheckBox cb = (JCheckBox)ev.getSource();
    int index = Integer.valueOf(cb.getActionCommand()).intValue();
  }
}


Andere mogenlijkheid is om je checkboxen in een List bij te houden:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
int aantal = 100;
List checkBoxList = new LinkedList(aantal);

JCheckBox tmpBox = null;
for(int j=0; j<aantal; j++)
{
    tmpBox  = new JCheckBox(iconLogFalse, false);
    tmpBox.addItemlistener(this);
    tmpBox.setBounds(325, y, 22, 18);
    y = y + 20;
    checkBoxList.add(tmpBox);
}


En dan in je eventHandler:
Java:
1
2
3
4
5
6
7
8
public void itemStateChanged(ItemEvent ev)
{
  if (ev.getSource() instanceof JCheckBox)
  {
    JCheckBox cb = (JCheckBox)ev.getSource();
    int index = checkBoxList.indexOf(cb);
  }
}


De tweede oplossing scheelt je het casten van ints naar string en weer terug :)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
Is het om dit soort tiepvauten te voorkomen niet handiger om Eclipse oid te gebruiken?
Op zich wel, maar ik werk op een PII 650 met 256MB geheugen en dat trekt ie niet zo heel goed.. :) dus werk met UltraEdit..
Pagina: 1