2012-01-03 2 views
0

Я очень новичок в этом. Моя заявка работает нормально, за исключением печати HashMap до JTable в VisaArtiklarWindow. это должно быть сделано через класс контроллера. Я попытался использовать 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

ответ

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 
     } 
    } 
} 

Конечно, вы можете сделать лучше, не внедряя карту.


Edit 1

Для того, чтобы позволить JTable функции (обновление) должным образом, вы должны внести изменения в TableModel.

Поэтому замените переменную Map на переменную TableModel. Используйте эту переменную для программного изменения модели.

TableModel может использовать карту в качестве держателя данных. Теперь DefaultTableModel выполняет собственную защиту данных. Интерфейс TableModel слишком абстрактный, особенно он не обрабатывает события изменений. Лучше всего использовать AbstractTableModel в качестве базового класса.

Чтобы удовлетворить требованиям AbstractTableModel, ваша IDE позволит вам реализовать абстрактные методы и переопределить некоторые методы, чтобы сделать модель.

Для работы с вашими данными вам по-прежнему необходимо добавить методы, ранее сделанные на карте, например put (Integer articleno, статья 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

+0

(Вы не глупы, я понимаю, что я дал очень фрагментарное решение.) Я отредактирую свой ответ. –