gpt4 book ai didi

java - HashMap 到 JTable

转载 作者:行者123 更新时间:2023-12-02 08:02:18 25 4
gpt4 key购买 nike

我对此很陌生。我的应用程序工作正常,除了将 HashMap 打印到 VisaArtiklarWindow 中的 JTable 之外。这必须通过 Controller 类来完成。我尝试过使用 TableModel 和其他一些东西,但似乎没有任何效果。有什么建议么?

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

}

Controller :

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

}

最佳答案

首先:HashMap 是无序的,您可能需要 TreeMap,因此行按文章编号排序。

TableModel 最简单,但事件处理需要注意,以便 JTable 收到更改通知。

问题是,如果更改 map ,模型不会意识到,尤其是并发访问可能会出错。因此,最好的方法是用您自己的 TableModel (implements Map<A, B>)替换 map 。

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 可以在内部使用 Map 作为数据持有者。现在,DefaultTableModel 拥有自己的数据包含。 TableModel 接口(interface)过于抽象,尤其是它不处理更改事件。 AbstractTableModel 作为基类是最好的。

为了满足 AbstractTableModel,您的 IDE 将允许您实现所需的抽象方法,并重写一些方法来构建模型。

要对数据进行操作,您仍然需要添加之前在 map 上完成的方法,例如 put(Integer Articleno, Article art)。这些方法可以将所有方法委托(delegate)给 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 内的 map 字段中。

关于java - HashMap 到 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com