好的,所以我有一个程序是矢量计算器。它将它的矢量存储在矢量的arraylist中,然后你可以通过摇摆的Jcombobox选择你想要使用的2个。我预先加载了一些矢量并且效果很好,但是当我尝试向组合框中添加一个新的矢量以便我可以选择那些时,组合框的下拉不会显示任何内容,当点击时会显示我刚添加的矢量。两个模型都必须包含相同的向量列表,所以我可以调出其中的任何两个来进行数学运算。
这是组合框代码:(我删除了getter和setter以减少冗长)
public class CalculatorPanel extends JPanel implements VectorsModel.Listener{
JButton addVector;
JButton dotProduct;
JComboBox vectorList;
JComboBox vectorList2;
JLabel currentVector;
Listener listener;
public CalculatorPanel(VectorHolder vh, VectorHolder vh2){
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
vectorList = new JComboBox(vh);
vectorList2 = new JComboBox(vh2);
vectorList.setPreferredSize(new Dimension(100, 20));
vectorList2.setSize(100, 20);
init();
}
public void init(){
addVector = new JButton("Add Vector");
dotProduct = new JButton("Dot Product");
addVector.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
listener.addVectorToList();
}
});
dotProduct.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
listener.dotProduct();
}
});
currentVector = new JLabel("Vector Answer Displays Here");
add(Box.createRigidArea(new Dimension(0,5)));
add(vectorList);
add(Box.createRigidArea(new Dimension(0,5)));
add(vectorList2);
add(Box.createRigidArea(new Dimension(0,5)));
add(currentVector);
add(Box.createRigidArea(new Dimension(0,5)));
add(addVector);
add(Box.createRigidArea(new Dimension(0,5)));
add(dotProduct);
setVisible(true);
}
@Override
public void update(VectorsModel vm) {
currentVector.setText(vm.getCurrentVector().toString());
}
}
public class Main extends JFrame implements Listener{
CalculatorPanel panel;
VectorHolder vectorHolder;
VectorHolder vectorHolder2;
VectorsModel vectors = new VectorsModel();
VectorMath math = new VectorMath();
public static void main(String[] args) {
new Main().run();
}
public void run(){
makeFrame("Vector Calculator", 400, 400);
vectors.getVectors().add(new TwoVector(1, 2));
vectors.getVectors().add(new TwoVector(3, 2));
vectors.getVectors().add(new ThreeVector(3, 2, 1));
vectors.getVectors().add(new ThreeVector(4, 2, 1));
vectorHolder = new VectorHolder(vectors.getVectors());
vectorHolder2 = new VectorHolder(vectors.getVectors());
panel = new CalculatorPanel(vectorHolder, vectorHolder2);
panel.setListener(this);
vectors.setListener(panel);
add(panel);
pack();
setVisible(true);
}
private void makeFrame(String title, int width, int height)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(title);
setSize(width, height);
}
@Override
public void addVectorToList() {
if(vectors.getCurrentVector() != null){
vectors.getVectors().add(vectors.getCurrentVector());
}
else{
vectors.getVectors().add(new TwoVector(3, 4));
}
}
@Override
public void dotProduct() {
panel.getCurrentVector().setText("Answer: " + Double.toString((math.dotProduct((Vector)panel.getVectorList().getSelectedItem(), (Vector)panel.getVectorList2().getSelectedItem()))));
}
}
public class VectorHolder implements ComboBoxModel{
private List<Vector> vectors;
private Vector selectedVector;
private Listener listener;
private ListDataListener listListener;
public VectorHolder(List<Vector> lv){
vectors = lv;
}
public void addVector(TwoVector v){
vectors.add(v);
listener.update(this);
}
public List<Vector> getVectors() {
return vectors;
}
public void setVectors(List<Vector> vectors) {
this.vectors = vectors;
listener.update(this);
}
public void setListener(Listener listener) {
this.listener = listener;
listener.update(this);
}
public interface Listener{
public void update(VectorHolder data);
}
@Override
public void addListDataListener(ListDataListener l) {
listListener = l;
}
@Override
public Object getElementAt(int index) {
return vectors.get(index);
}
@Override
public int getSize() {
return vectors.size();
}
@Override
public void removeListDataListener(ListDataListener l) {
// TODO Auto-generated method stub
}
@Override
public Object getSelectedItem() {
return selectedVector;
}
@Override
public void setSelectedItem(Object anItem) {
selectedVector = (Vector) anItem;
}
}
public class VectorsModel {
private List<Vector> vectors;
private Vector currentVector;
VectorsModel.Listener listener;
public VectorsModel(){
vectors = new ArrayList<>();
}
public void addVector(){
vectors.add(currentVector);
}
public void setCurrentVector(Vector cv){
currentVector = cv;
listener.update(this);
}
public interface Listener{
public void update(VectorsModel vm);
}
}