2012-01-03 10 views
0

我對此很新。我的應用程序工作正常,除了在VisaArtiklarWindow中打印HashMapJTable。這必須通過控制器類來完成。我試圖使用TableModel和其他一些東西,但似乎沒有任何工作。有什麼建議麼?HashMap to JTable

的UiController:

public class UiController { 

    private NyArtikelWindow nyAW; 
private NyKundWindow nyKW; 
private NyOrderWindow nyOW; 
private VisaArtiklarWindow nyVAW; 
private VisaOrdrarWindow nyVOW; 
private SokKundWindow nyVSW; 
private MainWindow nyMW; 

private Controller controller; 

public UiController(Controller newController) { 

    This.controller=newController; 
    nyMW = new MainWindow(controller,this); 
    nyKW= new NyKundWindow (controller, this); 
    nyOW= new NyOrderWindow(controller, this); 
    nyVAW= new VisaArtiklarWindow(controller, this); 
    nyVOW = new VisaOrdrarWindow(controller, this); 
    nyVSW = new SokKundWindow(controller, this); 

} 


public void setVisibleOnMain(){ 
    nyMW.setVisibleOn(); 
} 

public void setVisibleOffMain() { 
    nyMW.setVisibleOff(); 
} 

public void setVisibleOnKund() { 
    nyKW.setVisibleOn(); 
} 

public void setVisibleOnArtikel() { 
    nyAW.setVisibleOn(); 
} 

public void setVisibleOnOrder() { 
    nyOW.setVisibleOn(); 
} 

public void setVisibleOnVisaArtikel() { 
    nyVAW.setVisibleOn(); 
} 

public void setVisibleOnVisaOrder() { 
    nyVOW.setVisibleOn(); 
} 

public void setVisibleOnSokKund() { 
    nyVSW.setVisibleOn(); 
} 

}

控制器:

public class Controller { 

private ArtikelReg ar; 
private UiController uiController; 
private KundReg kr; 
private KundOrderReg or; 

public Controller() { 
    uiController = new UiController(this); 
    ar = new ArtikelReg(this); 
    kr = new KundReg(this); 
    or = new KundOrderReg(this);  

    uiController.setVisibleOnMain(); 
} 

public void addKund (int nyttKundnr, String nyttPersorgnr, 
     String nyttNamn, String nyttKontaktperson, 
     String nyttAdress, int nyttPostnr, 
     String nyttOrt, int nyttTelefonnr, 
     String nyttEpost) { 
    Kund nyKund = new Kund(nyttKundnr, nyttPersorgnr, nyttNamn, nyttKontaktperson, nyttAdress, nyttPostnr, nyttOrt, nyttTelefonnr, nyttEpost);  
    kr.AddKund(nyKund); 

} 

public Kund updateKund(int nyttKundnr, String nyttPersorgnr, 
     String nyttNamn, String nyttKontaktperson, 
     String nyttAdress, int nyttPostnr, 
     String nyttOrt, int nyttTelefonnr, 
     String nyttEpost){ 
    Kund kund = new Kund(nyttKundnr, nyttPersorgnr, nyttNamn, nyttKontaktperson, nyttAdress, nyttPostnr, nyttOrt, nyttTelefonnr, nyttEpost);   
    kr.AddKund(kund); 
    return kund; 
} 


public void addArtikel(int nyttArtikelnr, String nyttNamn, double nyttInpris, double nyttUtpris) { 
    Artikel artikel = new Artikel(nyttArtikelnr, nyttNamn, nyttInpris, nyttUtpris); 
    ar.addArtikel(artikel); 
} 

public Artikel updateArtikel(int nyttArtikelnr, String nyttNamn, double nyttInpris, double nyttUtpris) { 
    Artikel artikel = new Artikel(nyttArtikelnr, nyttNamn, nyttInpris, nyttUtpris); 
    ar.addArtikel(artikel); 
    return artikel; 
} 

}

使文章的勝利道瓊斯:

public class NyArtikelWindow extends JFrame { 
private JLabel lblArtikelnummer = new JLabel(); 

private JTextField txtArtikelnummer = new JTextField(); 
private JTextField txtArtikelnamn = new JTextField(); 
private JTextField txtInpris = new JTextField(); 
private JTextField txtUtpris = new JTextField(); 
private JTextField txtLeverantor = new JTextField(); 

private JLabel lblArtikelnamn = new JLabel(); 
private JLabel lblInpris = new JLabel(); 
private JLabel lblUtpris = new JLabel();  
private JLabel lblLeverantor = new JLabel(); 

private JButton btnSpara = new JButton(); 
private JButton btnAvbryt = new JButton(); 

private Controller controller; 
private UiController uicontroller; 


public NyArtikelWindow(Controller controller, UiController uiController){ 
    this.controller = controller; 
    this.uicontroller = uiController; 

    this.getContentPane().setLayout(null); 
    this.setSize(new Dimension(432, 285)); 
    this.setTitle("Ny artikel"); 
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    lblArtikelnummer.setText("Artikelnummer:"); 
    lblArtikelnummer.setBounds(new Rectangle(25, 35, 75, 15)); 
    txtArtikelnummer.setBounds(new Rectangle(105, 30, 110, 20)); 
    lblArtikelnamn.setText("Artikelnamn:"); 
    lblArtikelnamn.setBounds(new Rectangle(30, 80, 65, 15)); 
    txtArtikelnamn.setBounds(new Rectangle(105, 75, 280, 20)); 
    lblInpris.setText("Inpris:"); 
    lblInpris.setBounds(new Rectangle(60, 160, 34, 14)); 
    txtInpris.setBounds(new Rectangle(105, 155, 60, 20)); 
    lblUtpris.setText("Utpris:"); 
    lblUtpris.setBounds(new Rectangle(180, 160, 34, 14)); 
    txtUtpris.setBounds(new Rectangle(220, 155, 60, 20)); 
    lblLeverantor.setText("Leverantör:"); 
    lblLeverantor.setBounds(new Rectangle(30, 115, 60, 15)); 
    txtLeverantor.setBounds(new Rectangle(105, 110, 280, 20)); 
    btnSpara.setText("Spara"); 
    btnSpara.setBounds(new Rectangle(250, 215, 75, 21)); 
    btnSpara.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      btnSpara_actionPerformed(e); 
     } 
    }); 
    btnAvbryt.setText("Avbryt"); 
    btnAvbryt.setBounds(new Rectangle(330, 215, 75, 21)); 
    btnAvbryt.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
       NyArtikelWindow.this.setVisible(false); 
       NyArtikelWindow.this.dispose(); 
     } 
    }); 
    this.getContentPane().add(btnAvbryt, null); 
    this.getContentPane().add(btnSpara, null); 
    this.getContentPane().add(txtLeverantor, null); 
    this.getContentPane().add(lblLeverantor, null); 
    this.getContentPane().add(txtUtpris, null); 
    this.getContentPane().add(lblUtpris, null); 
    this.getContentPane().add(txtInpris, null); 
    this.getContentPane().add(lblInpris, null); 
    this.getContentPane().add(txtArtikelnamn, null); 
    this.getContentPane().add(lblArtikelnamn, null); 
    this.getContentPane().add(txtArtikelnummer, null); 
    this.getContentPane().add(lblArtikelnummer, null); 
} 

public void setVisibleOn() { 
    setVisible(true); 
} 

public void btnSpara_actionPerformed(ActionEvent e) { 

    String Artikelnr = txtArtikelnummer.getText(); 
    String nyttNamn = txtArtikelnamn.getText(); 
    String Inpris = txtInpris.getText(); 
    String Utpris = txtUtpris.getText(); 

    int nyttArtikelnr = Integer.parseInt(Artikelnr); 
    double nyttInpris = Double.parseDouble(Inpris); 
    double nyttUtpris = Double.parseDouble(Utpris); 
    System.out.println(nyttArtikelnr+nyttNamn+nyttInpris+nyttUtpris); 
    controller.addArtikel(nyttArtikelnr, nyttNamn, nyttInpris, nyttUtpris); 
    txtArtikelnummer.setText(null); //btntest 
    } 

}

ArtikelReg:

 import java.util.*; 

     public class ArtikelReg { 

private HashMap<Integer, Artikel> artikelreg = new HashMap<Integer, Artikel>(); 
private Controller controller; 

public ArtikelReg(Controller controller) { 
    this.controller = controller; 
} 

//lägg till en Artikel 
public void addArtikel(Artikel artikel){ 
    artikelreg.put(artikel.getArtikelnr(), artikel); 
} 

//Ta bort Artikel 
public void raderaArtikel(Kund RaderaKund){ 
    artikelreg.remove(RaderaKund); 
} 

//hämtar artikelregistret 
public HashMap <Integer, Artikel> getArtikelreg(){ 
    return this.artikelreg; 
} 

public void setArtikelReg(HashMap<Integer, Artikel> artikelreg) { 
    this.artikelreg = artikelreg; 
} 

//Hämtar en artikel ur registret 
public Artikel visaArtikel(int Artikelnr){ 
    return artikelreg.get(Artikelnr); 
} 

}

顯示Articlewindow

import java.awt.Dimension; 

import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class VisaArtiklarWindow extends JFrame { 
private JLabel lblArtiklar = new JLabel(); 
private JTable tblArtiklar = new JTable(); 

private JButton btnNy = new JButton(); 
private JButton btnTabort = new JButton(); 
private JButton btnStang = new JButton(); 

private Controller controller; 
private UiController uicontroller; 

public VisaArtiklarWindow (Controller controller, UiController uiController) { 

    this.controller = controller; 
    this.uicontroller = uiController; 

    this.getContentPane().setLayout(null); 
    this.setSize(new Dimension(627, 388)); 
    this.setTitle("Visa artiklar"); 
    lblArtiklar.setText("Artiklar:"); 
    lblArtiklar.setBounds(new Rectangle(30, 30, 55, 15)); 


    tblArtiklar=new JTable(); 
    tblArtiklar.setBounds(new Rectangle(30, 50, 490, 250)); 
    tblArtiklar.setModel(controller.toTableModel()); 



    btnNy.setText("Ny..."); 
    btnNy.setBounds(new Rectangle(530, 50, 75, 21)); 
    btnNy.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      btnNy_actionPerformed(e); 
     } 
    }); 
    btnTabort.setText("Ta bort"); 
    btnTabort.setBounds(new Rectangle(530, 80, 75, 21)); 
    btnStang.setText("Stäng"); 
    btnStang.setBounds(new Rectangle(530, 320, 75, 21)); 
    this.getContentPane().add(btnStang, null); 
    this.getContentPane().add(btnTabort, null); 
    this.getContentPane().add(btnNy, null); 
    this.getContentPane().add(tblArtiklar, null); 
    this.getContentPane().add(lblArtiklar, null); 
} 

public void setVisibleOn() { 
    setVisible(true); 
} 

}

+0

你應該減少大量的代碼到最重要的部分 – oers 2012-01-05 08:07:09

回答

2

第一:HashMap是無序的,你可能想要一個TreeMap,所以行按照商品編號排序。

TableModel是最簡單的,但事件處理需要一點關注,以便JTable被通知變化。

問題是,如果更改地圖,模型不知道,特別是併發訪問可能會導致錯誤。 所以最好的方法是用替換的地圖與你自己的TableModel(implements Map<A, B>)。

public class MapTableModel<A, B> extends AbstractTableModel 
     implements SortedMap<A, B> { 

    private SortedMap<A, B> map = new TreeMap<A, B>(); 

    SortedMapTableModel() { 
    } 

    @Override 
    public B put(A key, B value) { 
     B old = map.put(key, value); // Delegate to an existing Map implementation. 
     if (old == null) { 
      fireTableStructureChanged(); // New row 
     } else { 
      fireTableDataChanged(); // Changed row 
     } 
    } 
} 

當然你可以做得更好,而不是實現Map。


編輯1

爲了讓JTable的功能(更新正確),你必須在TableModel的更改。

因此,用TableModel變量替換Map變量。使用這個變量來編程改變模型。

TableModel可以在內部使用Map作爲數據存儲器。現在,DefaultTableModel執行自己的數據包含。 TableModel接口太抽象了,特別是它不處理更改事件。 AbstractTableModel作爲基類是最好的。

爲了滿足AbstractTableModel,您的IDE將允許您實現所需的抽象方法,並覆蓋一些方法來創建模型。

爲了處理您的數據,您仍然需要添加之前在地圖上完成的方法,比如put(Integer articleno,Article art)。這些方法可以將所有方法委託給地圖的方法,並引發事件發生變化的事件。

應該還提到併發訪問的問題:修改模型,而它正在繪製:尤其是併發地圖,http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentMap.html,但也許是太http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedSortedMap%28java.util.SortedMap%29

如果這是太多,延長DefaultTableModel代替,並保持數據的兩倍,在DefaultTableMode和TableModel中的地圖字段中。

+0

maby我很笨,但我不明白你在說什麼joop。我看到你將它改爲TreeMap,而不是@override。我怎樣才能打印出JTable – Sebastian 2012-01-03 15:46:44

+0

(你不傻,我意識到我確實給出了一個非常零碎的解決方案。)我將編輯我的答案。 – 2012-01-03 16:27:21