Just nu i M3-nätverket
Jump to content

combobox


PG25

Recommended Posts

Hej!

 

Om jag har fler comboboxar med samma innehåll. Om ett object väljs i en av dem ska de försvinna i alla dem andra. Sammtidigt om jag väljer ett annat object i den då ska objectet komma tillbaka i alla dem andra.

Någon som har nån bra ide på hur detta ska lösas?

 

/Per

 

[inlägget ändrat 2006-04-06 15:38:33 av PG25]

Link to comment
Share on other sites

jerker olofsson

En smart lösning (enligt mig) är att du "binder" dina comboboxar mot en collection/lista.

 

När ett val görs i comboboxen så tar du bort det valda elementet ur listan. Comboboxen "äger" nu detta objekt.

 

När du gör ett nytt val, så stoppas det gamla alternativet in i listan, och det nya valet plockas ut.

 

Efter varje val så "binder" du om dina comboboxar.

 

Varje "bind" funktion ser ut något liknande:

void bind( object[] coll, object comboBox, object selectedItem ) {

foreach( object o in coll )

// add "o" to combo box

}

// Add selected item to comboBox

}

 

void onChangeEvent( object comboBox, object selectedItem ) {

if( currentSelectedItem != null ) {

myColl.add( currentSelectedItem );

}

currentSelectedItem = selectedItem;

reBindAll();

}

 

 

Link to comment
Share on other sites

Ping,

 

om du nu vill ha en lösning i Java och inte JavaScript så kanske följande kan vara ett tips. Det är inte så lysande skrivet direkt, men utgår från att alla JComboBoxar är knutna till en "datapool" som uppdaterar alla andra comboboxars datamodell automagiskt när en av dom ändras.

 

[log]

import javax.swing.*;

import java.awt.*;

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import java.util.ArrayList;

import java.util.HashMap;

 

 

public class Combo extends JFrame

{

private SharedDataPool myPool;

private JComboBox[] myBoxes;

 

public Combo( String title )

{

super(title);

myPool = new SharedDataPool();

for (int i = 0; i < 10; i ++)

{

myPool.addValue(""+i);

}

myBoxes = new JComboBox[5];

setLayout(new FlowLayout());

for (int i = 0; i < 5; i ++)

{

myBoxes = new JComboBox(new MultipleExclusionOwnerModel(myPool));

myBoxes.addItemListener(myPool);

getContentPane().add(myBoxes);

}

setDefaultCloseOperation(EXIT_ON_CLOSE);

setLocationRelativeTo(null);

pack();

}

 

public static void main(String[] args)

{

new Combo("Ook").setVisible(true);

}

 

private class SharedDataPool implements ItemListener

{

private HashMap<MultipleExclusionOwnerModel, String> myOwnedList;

private ArrayList<MultipleExclusionOwnerModel> myListeners;

private ArrayList<String> myValues;

 

public SharedDataPool( )

{

myOwnedList = new HashMap<MultipleExclusionOwnerModel, String>();

myListeners = new ArrayList<MultipleExclusionOwnerModel>();

myValues = new ArrayList<String>();

}

 

public int getSize()

{

return myValues.size() - myOwnedList.size();

}

 

public void addListener(MultipleExclusionOwnerModel aModel)

{

myListeners.add(aModel);

}

 

public void addValue(String aValue)

{

myValues.add(aValue);

reloadAllModelsExcept(null);

}

 

public ArrayList<String> getAvailable(MultipleExclusionOwnerModel anAsker)

{

ArrayList<String> theList = new ArrayList<String>();

for (String theValue : myValues)

{

if ( (myOwnedList.get(anAsker) == theValue) || !myOwnedList.containsValue(theValue))

{

theList.add(theValue);

}

}

return theList;

}

 

public void setSelection( MultipleExclusionOwnerModel aModel, String s )

{

if (myOwnedList.get(aModel) == s)

{

return;

}

myOwnedList.put(aModel, s);

reloadAllModelsExcept(aModel);

}

 

public void reloadAllModelsExcept(MultipleExclusionOwnerModel aModel)

{

for (MultipleExclusionOwnerModel theModel : myListeners)

{

if (theModel == aModel )

{

continue;

}

 

Object theSelection = theModel.getSelectedItem(); // Remember selection

 

theModel.myCurrentlyAvailable = getAvailable(theModel);

theModel.fireContentsChanged(theModel, 0, theModel.myCurrentlyAvailable.size()-1);

theModel.setSelectedItem(theSelection);

}

}

 

public void itemStateChanged( ItemEvent e )

{

MultipleExclusionOwnerModel theModel = (MultipleExclusionOwnerModel) ((JComboBox) e.getSource()).getModel();

setSelection(theModel, (String) theModel.getSelectedItem());

}

}

 

private class MultipleExclusionOwnerModel extends DefaultComboBoxModel

{

private ArrayList<String> myCurrentlyAvailable;

private SharedDataPool myPool;

 

public MultipleExclusionOwnerModel(SharedDataPool aPool)

{

myPool = aPool;

myPool.addListener(this);

myCurrentlyAvailable = myPool.getAvailable(this);

}

 

public int getSize()

{

return myCurrentlyAvailable.size();

}

 

public Object getElementAt( int index )

{

return myCurrentlyAvailable.get(index);

}

 

protected void fireContentsChanged( Object source, int index0, int index1 )

{

super.fireContentsChanged(source, index0, index1);

}

}

}

 

[/log]

 

Nå, det är en lösning i alla fall...

 

[edit]

Ehh...kanske inte var det snyggaste jag gjort i mitt liv, en del buggar där. Nåja, idén borde vara där i alla fall.

[inlägget ändrat 2006-04-07 14:53:30 av Que]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...