HashMap для JTable - PullRequest
       3

HashMap для JTable

0 голосов
/ 03 января 2012

Я очень новичок в этом.Мое приложение работает нормально, за исключением печати от HashMap до JTable в VisaArtiklarWindow.это должно быть сделано через класс контроллера.Я пытался использовать TableModel и некоторые другие вещи, но, похоже, ничего не работает.Какие-либо предложения?

Контроллер UiC:

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

}

Показать окно статьи

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

}

1 Ответ

2 голосов
/ 03 января 2012

Во-первых: 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.

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

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

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

Для работы с вашими данными вам все равно нужно добавить методы, ранее выполненные на карте, например put (Integer articleno, Article art). Эти методы могут делегировать все методы map и генерировать событие, если что-то изменилось.

Также следует упомянуть о проблемах одновременного доступа: изменение модели во время ее прорисовки: особенно Concurrent Map, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...