webForumDet fria alternativet

Trigga förändring i JTable mha JComboBox?

5 svar · 232 visningar · startad av CokeLight

CokeLightMedlem sedan juni 2000504 inlägg
#1

Hejsan.. undrar hur man gör för att göra så att JTable innehåll ändras beroende på vad som väljs i en JComboBox?

Just nu har jag:

JComboBox ddlCaseOwners = new JComboBox(ownerData);	
...
ddlCaseOwners.addActionListener(this);
ddlCaseOwners.setActionCommand("ddlCaseOwners");

och sen

public void actionPerformed(ActionEvent e)
{
   if(e.getActionCommand().equals("ddlCaseOwners"))
  {
      String curOwner = (((JComboBox)e.getSource()).getSelectedItem()).toString();
			
			
   if(curOwner.equals("Visa alla")) 
      curOwner = "listAllCases";
				
   this.makeTable( curOwner );
   }
}

och sen i makeTable(String curOwner) så skapar jag min JTable och bygger upp rows/columns baserat på värde som skickas in dit.. det fungerar om jag hårdkodar värde som skickas in men inte när det sker dynamiskt.. (hade det varit webbsida antar jag att "sidan" hade refreshats vid PostBack.. :) Men jag har ingen aning om hur man gör här..?

har läst att det finns TableModelListener men är osäker på hur man implementerar det..

CokeLightMedlem sedan juni 2000504 inlägg
#2

Tänkte bara förtydliga scenariot lite i försäkerhetsskull.. var lite sömnig när jag skrev mitt första inlägg :)

Alltså, jag skulle vilja uppnå en effekt som gör att min JTable "refreshas" på samma sätt som en webbsida blir det vid förändringar. I mitt fall har jag en JComboBox som skickar ett värde vilket snappas upp av actionPerformed. Därifrån skickar jag vidare detta värde till min JTable som mycket riktigt får det nya och enkelt skriver ut det i konsolen. Men, detta värde ligger till grund för hur JTable ritas upp, ungefär på följande sätt: Om "Bosse" skickas in som värde, lista då alla värden från databasen (min XML fil) där endast "Bosse" är ansvarig. Om "Lena" skickas in, så loopa ska JTable bara hämta värden där hon är ansvarig osv.

(Jag filtrerar mot en XML fil, men motsvarande SQL skulle kanske vara nåt i stil med:

SELECT <fname> FROM <supportcases> WHERE owner = <curOwner>

Om jag hårdkodar värdet som skickas, kompilerar om, och kör programmet så ritas JTable upp med korrekta värden, men inte när det görs dynamiskt.

Aleph_OneMedlem sedan juni 2003372 inlägg
#3

För att få ut värdet på vald "item" i din combo kan du använda metoden getSelectedItem() och tillsammans med en actionlistener se till så att du blir notifierad när nåt ändrats så du kan uppdatera din JTable.

tex

combo = new JComboBox();
combo.addActionListener(new ActionListener()
{
	public void actionPerformed(ActionEvent evt)
	{
		//gör nåt anrop för att updatera din JTable
		System.out.println("selected: " + combo.getSelectedItem());
	}
});

Och för att jobba mot din JTable kan du tex använda en DefaultTableModel
skapa en JTable, eller ärv av den och överlagra vissa metoder och lägga till egna om du så vill och på instansen av din JTable så sätter du din modell med setModel(<dinmodell>).
Jobba sen mot modellen för att lägga till och ta bort grejer.

CokeLightMedlem sedan juni 2000504 inlägg
#4

Hejsan, tack för svaret.. jo, precis, jag hade gjort nåt liknade för att hämta värdet från combo boxen:

String curOwner = (((JComboBox)e.getSource()).getSelectedItem()).toString();

//gör nåt anrop för att updatera din JTable

a det är det här anropet som jag inte hittar riktigt.. sen var det nån som föreslog att man kunde använda validate().. provade lite men fick det inte att funka för tillfället.. har läst lite om det.. o såg att det fanns nåt som hette

DefaultTableCellRenderer

Implementation Note: ... So this class overrides the validate, revalidate, repaint, and firePropertyChange methods to be no-ops. If you write your own renderer, please keep this performance consideration in mind.

Så jag har provat att ärva direkt från DefaultTableCellRenderer istället (använder den som modell).. men måste nu bygga om hela JTable eftersom syntaxen är lite annorlunda.. om detta var lösningen ska jag posta om det funkar... får väl gräva vidare i annat fall.. Swing var mycket svårare än jag från början trott.. :)

phonkworksMedlem sedan juli 2001228 inlägg
#5

Bygger du ditt swing gui med Netbeans så blir allt med ens glasklart ;)

phonk

CokeLightMedlem sedan juni 2000504 inlägg
#6

hehe.. a jag använde det i början, men det gick lite långsamt kändes det som.. hmm.. men kan man klicka fram komponenter där som i JBuilder (eller Visual Studio) ? coolt om man kunde göra precis sånt här med JTable med checkboxar o händelselyssnare automatiskt t.ex.. :) o sen kolla på koden för att lära sig.. kanske kan va värt o kolla (just nu anv. jag JCreator.. har hört att Eclipse ska va bra.. nån som vet om kan man klicka på Swing grejer där också eller?)

Fick hjälp idag med det här så det löste sig.. kan beskriva lite (om det nu skulle va intressant :)

i ActionPerformed så räckte det helt enkelt med att ta bort min nuvarande JTable (jag gjorde min pane till global och sen typ pane.remove(table)). Därefter skapar jag en en ny table och slutligen en validate.. hehe.. nästan anti-klimax eftersom jag trodde att det skulle va nån jättesvår lösning.. i kod ser det ut så här iaf:

public void actionPerformed(ActionEvent e)
{
   if(e.getActionCommand().equals("ddlCaseOwners"))
   {
      this.setCurOwner((((JComboBox)e.getSource()).getSelectedItem()).toString());
			
      if(this.getCurOwner().equals("Visa alla")) 
         this.setCurOwner("listAllCases");
						
      [b]this.getPane().remove(scrPn);[/b]
			
      scrPn = new JScrollPane(this.makeTable());
      scrPn.setBounds(10, 50, 750, 150);
      this.getPane().add(scrPn);
			
      [b]this.validate();[/b]//där min klass extends jframe
   }
}

man kan nog göra lite snyggare, men just nu är jag glad att det funkar.. :)

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)