Swing JCombobox Weiße Leerzeilen

DevNik

Mitglied
Halllo liebes Forum
ich habe ein kleines Problem.
Ich habe eine JCombox mit eigenem Model.
Das wird auch alles gut und schön angezeigt. Sobald ich allerdings ein Objekt der Liste auf die sich das Model bezieht hinzufüge werden im DropDown Bereich nur noch Leere Weiße Zeilen angezeigt.

Relevanter Code:
(In der Klasse Settings eine statische ArrayList der ForceFields)

Java:
public class ForceFieldGroup extends JPanel implements ActionListener{
    private JComboBox<ForceField> forceFieldBox;
    private MyComboBoxModel model;

    public ForceFieldGroup() {
        this.model = new MyComboBoxModel();
        this.forceFieldBox = new JComboBox<>(model);
        this.add(forceFieldBox);
        forceFieldBox.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(model.getSelectedItem().equals("New")) {
        Settings.forceFields.add(new SimpleForceField("Test", 0, 0, 0, 0, 0));
        }
        forceFieldBox.revalidate();
        forceFieldBox.repaint();
    }
   
}

Java:
public class MyComboBoxModel implements ComboBoxModel{
   Object selcted = Settings.forceFields.get(0);
   
   
   
   public ForceField getSelectedForceField() {
       return (ForceField) selcted;
   }

   @Override
   public void addListDataListener(ListDataListener l) {
       // TODO Auto-generated method stub
   }

   @Override
   public Object getElementAt(int index) {
       if(index==Settings.forceFields.size())
           return "New";
       return Settings.forceFields.get(index);
   }

   @Override
   public int getSize() {
       return Settings.forceFields.size()+1;
   }

   @Override
   public void removeListDataListener(ListDataListener l) {
       // TODO Auto-generated method stub
   }

   @Override
   public Object getSelectedItem() {
       return selcted;
   }

   @Override
   public void setSelectedItem(Object o) {
       selcted = o;
   }

   public void addElement(Object f) {
         Settings.forceFields.add(f);
   }

   public void removeElement(ForceField s) {
       Settings.forceFields.remove(s);
   }

   public void addForceField(ForceField temp) {
       Settings.forceFields.add(temp);
   }
}
 
Also gibt es zwei Klassen? SimpleForceField und ForceField?

Wenn ich auf die unterste leere Zeile klicke wird die Box nach unten hin länger. Es reagiert also auf das unsichtbare "New".
 
Zuletzt bearbeitet:
Ist Settings.forceFields eine static List? statische Sachen von mehreren Objekten zu verändern kann unschöne Effekte haben. Veränderst du diese auch noch durch andere Objekte?

Bei der Initialisierung deiner forceFieldBox hast du leere eckige Klammern <>, ist das gewollt?
 
Zuletzt bearbeitet:
Ja Settings.forceFields ist eine static List. Sie wird allerdings woanders nicht bearbeitet.
Ich werde mal schauen, ob ich die Liste ohne static machen kann.
Zu dem zweiten: Ich habe gedacht die Intialisirung von Listen reicht allein mit <> seit der neuesten java Version aus. hatte auch noch nie Probleme damit.
 
So etwas ist in Java möglich und es erscheint auch keine Warnung:
Java:
ArrayList<ForceField> a = new ArrayList<>();
Folgendes ist auch möglich aber es erscheint eine Warnung ("Type safety: The expression of type JComboBox needs unchecked conversion to conform to JComboBox<ForceField>")
Java:
JComboBox<ForceField> b = new JComboBox<>(model);
 
@MoxxiManagarm Er verändert die Liste in beiden Klassen (ForceFieldGroup und MyComboBoxModel).

Die grafische Darstellung der ComboBox scheint nicht zu funktionieren. Wenn ich es mir in der Konsole ausgeben lasse funktioniert es. Da steht dann z.B.:
ForceField@75a11ba8
ForceField@3ffec63a

(Per toString()-Methode ließe sich natürlich auch der String ausgeben).
 
Zuletzt bearbeitet:
ich würde auch darauf schließen, dass etwas mit der Darstellung nicht stimmt. Die Combobox wird ja passend dargestellt, nur sobald ich iwo Settings.forceField.add....... aufrufe kommt es zu diesen weißen Feldern. Wie gesagt, sobald ich Zeit habe probiere ich die Liste nicht static zu machen.
 
Ich habe es auch schon ohne static versucht. Das klappte auch nicht. Wie dem auch sei, ich habe jetzt eine Lösung gefunden.

Java:
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JPanel;

public class Hauptprogramm {

	public static void main(String[] args) {

		JFrame j = new JFrame();
		j.setSize(300, 300);
		j.getContentPane().add(new ForceFieldGroup());
		j.setVisible(true);
	}
}

class ForceField {

	String s;

	public ForceField(String string, int i, int j, int k, int l, int m) {

		s = string;
	}

}

class ForceFieldGroup extends JPanel implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JComboBox<Object> forceFieldBox;

	public ForceFieldGroup() {

		Settings.forceFields.add(new ForceField("fghhjlf", 0, 0, 0, 0, 0));

		this.forceFieldBox = new JComboBox<Object>();

		for (int i = 0; i < Settings.forceFields.size(); i++) {
			forceFieldBox.addItem(Settings.forceFields.get(i));
		}

		this.add(forceFieldBox);
		forceFieldBox.addActionListener(this);
		forceFieldBox.addItem("New");
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (forceFieldBox.getSelectedItem() instanceof String && forceFieldBox.getSelectedItem().equals("New")) {

			Settings.forceFields.add(new ForceField("Test", 0, 0, 0, 0, 0));

			forceFieldBox.removeAllItems();

			for (int i = 0; i < Settings.forceFields.size(); i++) {
				forceFieldBox.addItem(Settings.forceFields.get(i));
			}

			forceFieldBox.addItem("New");

		}

	}

}

class Settings {

	public static ArrayList<ForceField> forceFields = new ArrayList<>();

}
 
Mit krgewb Idees hat es zwar funktioniert, allerdings habe ich mich nun gegen JCombobox entschieden.
Begründung:
Wenn man zu der Combobox Items hinzufügt, ist wieder das erste Item selected. Man kann zwar mit setSelected ein Item auswählen, allerdings wird das nicht auf der Benutzeroberfläche angezeigt.
Vielen Dank für alle Antworten!
 

Zurück
Oben