- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对此很陌生。我的应用程序工作正常,除了将 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/
我有不同的结构,它们都包含一个 HashMap与 String作为键,但具有不同的值类型。例如,一个结构有一个类型为 HashMap 的成员, 另一个将有一个 HashMap 类型的成员, 等等。 我
我想制作一个包含学生姓名和科目的板,每个学生在每个科目中都有一个成绩(或者没有..他可以离开考试而不写,然后他的案子将是空的)。我只想使用 HashMap。我的意思是,它会是这样的: HashMap>
是否有内存和速度高效的方法来在 HashMap 中动态存储唯一键:值对? key 保证是唯一的,但它们的数量经常变化。插入和删除必须很快。 我所做的是包含有符号距离场的八叉树(非线性/完整)。八叉树经
有谁知道为什么选择通过 LinkedList 而不是另一个 Hashmap 来实现 HashMap 的存储桶。如果桶本身变成了 HashMap,那么 contains 或 get 的时间复杂度似乎是
我想创建一个具有嵌套结构的 HashMap,就像这个复杂的示例: { type: boy name: Phineas father: type: man
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) 关闭 7 年前。 我想要一个可扩展的字典,将 Object 与
HashMap> hm = new HashMap>(); hm.put("Title1","Key1"); for(int i=0;i hm1 = new H
我必须修改当前代码以适应 Spring MVC。我有 HashMap hashmap = new HashMap(); request.setAttribute("dslrErrors", hashm
我正在尝试进行一些错误捕获。 错误应该检查数组的长度是否小于 2,并检查 HashMap 是否包含用户输入的键。 捕获的错误必须仅使用 if 语句,并且必须使用 .length() 方法,并且必须使用
在 stackoverflow 上提出另一个问题后,(Java- Why this program not throwing concurrent Modification exception)我开始
我有两个类,想使用 org.dozer.Mapper( http://dozer.sourceforge.net/ ) 将 Female 对象的属性映射到 Male 对象。 第一类是: public
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
是否有任何方法可以检查 HashMap 是否包含一组特定的键(这些键是在数组中给出的)。当我尝试类似下面的代码时,它返回 false。 map.containsKey(arrayOf("2018-01
跟进我的问题:How To Access hash maps key when the key is an object 我想尝试这样的事情:webSearchHash.put(xfile.getPa
我有一个可扩展的 ListView ,对于每个 child ,我需要有 4 个“额外”或字符串或其他名称来调用它:- 子标题- 描述- 链接1- 链接2 跟着教程,创建 ListView 、不同的 p
我想确保这是正确的,因为如果不正确,它可能会破坏我的应用程序。 我有这个: private static HashMap> balance = new HashMap<>(); 如果我得到这样的值:
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我是一名优秀的程序员,十分优秀!