当打开相同 window 的多个实例时,将数据传递到所需的 window Java
Pass data to desired window when multiple instances of same window are opened Java
有人请帮助我
我正在使用一个 java 应用程序制作销售发票。我已经在下面复制了我的部分代码的工作示例。此应用程序包含一个带有菜单项的主 window,单击该菜单项时,将打开一个带有组合框的“促销”window select 项。在 selecting 项目上将打开一个弹出窗口以显示 select 价格,然后打开另一个弹出窗口以显示 select 数量。在 selecting Qty 时,销售单 Window 中的 table 将填写 Item、Price 和 Qty。
当打开多个销售 Windows 时,数量 window 中的数据将转到最后打开的销售 window。有什么方法可以将数据传递给旧的销售 window,通过鼠标单击将其置于最前面?
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Main extends JFrame {
private static JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
setTitle("Menu");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(500, 500, 500, 425);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setLayout(null);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnSales = new JMenu("Sales");
menuBar.add(mnSales);
JMenuItem mntmProcessSale = new JMenuItem("Generate Sales Invoice");
mntmProcessSale.addActionListener( e -> {
Sale frame = new Sale(this);
frame.setVisible(true);
});
mnSales.add(mntmProcessSale);
}
public static class Sale extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private static JTable table;
public Sale(JFrame sale) {
super(sale);
setTitle("Sale");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 400, 400);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setLayout(null);
setContentPane(contentPane);
lbl=new JLabel("Select Item");
lbl.setBounds(30, 30, 100, 20);
contentPane.add (lbl);
String [] item = {"A","B","C","D"};
combobox=new JComboBox(item);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String s= (String) combobox.getSelectedItem();
Price.Item(s);
combobox.setSelectedIndex(-1);
new Price(sale).setVisible(true);
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane.add (combobox);
JScrollPane scrollPane= new JScrollPane();
scrollPane.setBounds(20, 80, 250, 150);
contentPane.add(scrollPane);
table=new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"Item","Price", "Qty"
}
));
scrollPane.setViewportView(table);
}
public static void filltable(Object[] row) {
DefaultTableModel tm1 = (DefaultTableModel)table.getModel();
tm1.addRow(row);
System.out.println(row);
}
}
public static class Price extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private JPanel contentPane1;
static String Item =null;
public Price(JFrame price) {
super(price);
setTitle("Price");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 300, 300);
contentPane1 = new JPanel();
contentPane1.setLayout(null);
setLocationRelativeTo(null);
setContentPane(contentPane1);
lbl=new JLabel("Select Price");
lbl.setBounds(30, 30, 100, 20);
contentPane1.add (lbl);
String [] Price = {"5","10","20","30"};
combobox=new JComboBox(Price);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String s= (String) combobox.getSelectedItem();
Qty.Price(Item,s);
combobox.setSelectedIndex(-1);
new Qty(price).setVisible(true);
dispose();
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane1.add (combobox);
}
public static void Item(String item) {
Item=item;
}
}
public static class Qty extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private JPanel contentPane2;
static String Item =null;
static String Price =null;
public Qty(JFrame qty) {
super(qty);
setTitle("Qty");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 300, 300);
setLocationRelativeTo(null);
contentPane2 = new JPanel();
contentPane2.setLayout(null);
setContentPane(contentPane2);
lbl=new JLabel("Select Qty");
lbl.setBounds(30, 30, 100, 20);
contentPane2.add (lbl);
String [] Qty = {"1","2","3","4"};
combobox=new JComboBox(Qty);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String qty= (String) combobox.getSelectedItem();
Sale.filltable(new Object[] {Item,Price,qty});
dispose();
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane2.add (combobox);
}
public static void Price(String item, String price) {
Item=item; Price=price;
}
}
}
您的销售 class 静态引用了您正在填写的 table。这意味着 Sale 的所有实例共享相同的 table 引用 - 而这个 table 引用实际上属于上次打开的销售 window。这是一个主要错误,也是非常糟糕的做法。
我假设您将方法 fillTable 设为静态,因为您没有在 QTY 对话框中引用 Sale 对象。而这个静态方法导致静态字段。
我认为你必须阅读模型-视图-控制器范式并重新设计你的程序。
您当前的问题很容易解决:
- table class 销售
private final
。
- 将 Sale 对象作为构造函数参数传递给 Qty 对话框。然后你可以在ot.
中调用方法fillTable()
- 每个人和他的狗都给他们的名字命名 class
Main
。我把名字改成了OthrMain
.
- 不要在每次单击“销售”菜单项时都创建另一个
Sale
实例。我在 class OthrMain
. 中添加了一个名为 salesDlg
的成员变量
HIDE_ON_CLOSE
是 JDialog
的默认值,因此无需明确设置。
- 不需要显式设置
JDialog
内容窗格,所以不要这样做。
- 不要使用静态变量将数据从一个对象传递到另一个对象。如果您想将“销售额”
JDialog
中的值传递给“价格”JDialog
,则向“价格”JDialog
添加一个方法,即“销售额”JDialog
可以打电话。
- 不要使用空布局。使用适当的 layout managers
- 每个
JDialog
的所有者应该是打开它的 JDialog
。例如,“价格”JDialog
的所有者应该是“销售”JDialog
.
我相信下面的代码可以满足您的需求。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class OthrMain extends JFrame {
private Sale saleDlg;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
OthrMain frame = new OthrMain();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
public OthrMain() {
setTitle("Menu");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 425);
setLocationByPlatform(true);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnSales = new JMenu("Sales");
menuBar.add(mnSales);
JMenuItem mntmProcessSale = new JMenuItem("Generate Sales Invoice");
mntmProcessSale.addActionListener(e -> {
if (saleDlg == null) {
saleDlg = new Sale(this);
}
saleDlg.setVisible(true);
});
mnSales.add(mntmProcessSale);
}
public static class Sale extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
private final JTable table;
private Price priceDlg;
public Sale(JFrame sale) {
super(sale);
setTitle("Sale");
setSize(400, 400);
setLocationRelativeTo(sale);
JPanel topPanel = new JPanel();
lbl = new JLabel("Select Item");
topPanel.add(lbl);
String[] item = {"A", "B", "C", "D"};
combobox = new JComboBox<>(item);
combobox.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (priceDlg == null) {
priceDlg = new Price(Sale.this);
}
priceDlg.setVisible(true);
}
});
combobox.setSelectedIndex(-1);
topPanel.add(combobox);
add(topPanel, BorderLayout.PAGE_START);
JScrollPane scrollPane = new JScrollPane();
add(scrollPane, BorderLayout.CENTER);
table = new JTable();
table.setModel(new DefaultTableModel(new Object[][]{},
new String[]{"Item", "Price", "Qty"}));
scrollPane.setViewportView(table);
}
public void filltable(Object price, Object qty) {
Object[] row = new Object[3];
row[0] = combobox.getSelectedItem();
combobox.setSelectedIndex(-1);
row[1] = price;
row[2] = qty;
DefaultTableModel tm1 = (DefaultTableModel) table.getModel();
tm1.addRow(row);
}
}
public static class Price extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
private Qty qtyDlg;
public Price(JDialog price) {
super(price);
setTitle("Price");
setSize(300, 300);
setLocationRelativeTo(price);
JPanel panel = new JPanel();
lbl = new JLabel("Select Price");
panel.add(lbl);
String[] prices = {"5", "10", "20", "30"};
combobox = new JComboBox<>(prices);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (qtyDlg == null) {
qtyDlg = new Qty(Price.this);
}
qtyDlg.setVisible(true);
}
}
});
combobox.setSelectedIndex(-1);
panel.add(combobox);
add(panel, BorderLayout.PAGE_START);
}
public void clearPrice() {
combobox.setSelectedIndex(-1);
}
public Object getPrice() {
return combobox.getSelectedItem();
}
}
public static class Qty extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
public Qty(JDialog qty) {
super(qty);
setTitle("Qty");
setSize(300, 300);
setLocationRelativeTo(qty);
JPanel contentPane2 = new JPanel();
lbl = new JLabel("Select Qty");
contentPane2.add(lbl);
String[] Qty = {"1", "2", "3", "4"};
combobox = new JComboBox<>(Qty);
combobox.addItemListener(this::fillTable);
combobox.setSelectedIndex(-1);
contentPane2.add(combobox);
add(contentPane2);
}
public void fillTable(ItemEvent event) {
if (event.getStateChange() == ItemEvent.SELECTED) {
Object qty = combobox.getSelectedItem();
combobox.setSelectedIndex(-1);
Object price = ((Price) getOwner()).getPrice();
((Price) getOwner()).clearPrice();
((Sale) getOwner().getOwner()).filltable(price, qty);
setVisible(false);
getOwner().setVisible(false);
}
}
}
}
有人请帮助我
我正在使用一个 java 应用程序制作销售发票。我已经在下面复制了我的部分代码的工作示例。此应用程序包含一个带有菜单项的主 window,单击该菜单项时,将打开一个带有组合框的“促销”window select 项。在 selecting 项目上将打开一个弹出窗口以显示 select 价格,然后打开另一个弹出窗口以显示 select 数量。在 selecting Qty 时,销售单 Window 中的 table 将填写 Item、Price 和 Qty。
当打开多个销售 Windows 时,数量 window 中的数据将转到最后打开的销售 window。有什么方法可以将数据传递给旧的销售 window,通过鼠标单击将其置于最前面?
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Main extends JFrame {
private static JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
setTitle("Menu");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(500, 500, 500, 425);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setLayout(null);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnSales = new JMenu("Sales");
menuBar.add(mnSales);
JMenuItem mntmProcessSale = new JMenuItem("Generate Sales Invoice");
mntmProcessSale.addActionListener( e -> {
Sale frame = new Sale(this);
frame.setVisible(true);
});
mnSales.add(mntmProcessSale);
}
public static class Sale extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private static JTable table;
public Sale(JFrame sale) {
super(sale);
setTitle("Sale");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 400, 400);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setLayout(null);
setContentPane(contentPane);
lbl=new JLabel("Select Item");
lbl.setBounds(30, 30, 100, 20);
contentPane.add (lbl);
String [] item = {"A","B","C","D"};
combobox=new JComboBox(item);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String s= (String) combobox.getSelectedItem();
Price.Item(s);
combobox.setSelectedIndex(-1);
new Price(sale).setVisible(true);
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane.add (combobox);
JScrollPane scrollPane= new JScrollPane();
scrollPane.setBounds(20, 80, 250, 150);
contentPane.add(scrollPane);
table=new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
},
new String[] {
"Item","Price", "Qty"
}
));
scrollPane.setViewportView(table);
}
public static void filltable(Object[] row) {
DefaultTableModel tm1 = (DefaultTableModel)table.getModel();
tm1.addRow(row);
System.out.println(row);
}
}
public static class Price extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private JPanel contentPane1;
static String Item =null;
public Price(JFrame price) {
super(price);
setTitle("Price");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 300, 300);
contentPane1 = new JPanel();
contentPane1.setLayout(null);
setLocationRelativeTo(null);
setContentPane(contentPane1);
lbl=new JLabel("Select Price");
lbl.setBounds(30, 30, 100, 20);
contentPane1.add (lbl);
String [] Price = {"5","10","20","30"};
combobox=new JComboBox(Price);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String s= (String) combobox.getSelectedItem();
Qty.Price(Item,s);
combobox.setSelectedIndex(-1);
new Qty(price).setVisible(true);
dispose();
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane1.add (combobox);
}
public static void Item(String item) {
Item=item;
}
}
public static class Qty extends JDialog {
private JComboBox combobox;
private JLabel lbl;
private JPanel contentPane2;
static String Item =null;
static String Price =null;
public Qty(JFrame qty) {
super(qty);
setTitle("Qty");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(500, 500, 300, 300);
setLocationRelativeTo(null);
contentPane2 = new JPanel();
contentPane2.setLayout(null);
setContentPane(contentPane2);
lbl=new JLabel("Select Qty");
lbl.setBounds(30, 30, 100, 20);
contentPane2.add (lbl);
String [] Qty = {"1","2","3","4"};
combobox=new JComboBox(Qty);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
String qty= (String) combobox.getSelectedItem();
Sale.filltable(new Object[] {Item,Price,qty});
dispose();
}
}
});
combobox.setBounds(30, 50, 200, 20);
combobox.setSelectedIndex(-1);
contentPane2.add (combobox);
}
public static void Price(String item, String price) {
Item=item; Price=price;
}
}
}
您的销售 class 静态引用了您正在填写的 table。这意味着 Sale 的所有实例共享相同的 table 引用 - 而这个 table 引用实际上属于上次打开的销售 window。这是一个主要错误,也是非常糟糕的做法。
我假设您将方法 fillTable 设为静态,因为您没有在 QTY 对话框中引用 Sale 对象。而这个静态方法导致静态字段。
我认为你必须阅读模型-视图-控制器范式并重新设计你的程序。
您当前的问题很容易解决:
- table class 销售
private final
。 - 将 Sale 对象作为构造函数参数传递给 Qty 对话框。然后你可以在ot. 中调用方法fillTable()
- 每个人和他的狗都给他们的名字命名 class
Main
。我把名字改成了OthrMain
. - 不要在每次单击“销售”菜单项时都创建另一个
Sale
实例。我在 classOthrMain
. 中添加了一个名为 HIDE_ON_CLOSE
是JDialog
的默认值,因此无需明确设置。- 不需要显式设置
JDialog
内容窗格,所以不要这样做。 - 不要使用静态变量将数据从一个对象传递到另一个对象。如果您想将“销售额”
JDialog
中的值传递给“价格”JDialog
,则向“价格”JDialog
添加一个方法,即“销售额”JDialog
可以打电话。 - 不要使用空布局。使用适当的 layout managers
- 每个
JDialog
的所有者应该是打开它的JDialog
。例如,“价格”JDialog
的所有者应该是“销售”JDialog
.
salesDlg
的成员变量
我相信下面的代码可以满足您的需求。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class OthrMain extends JFrame {
private Sale saleDlg;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
OthrMain frame = new OthrMain();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
public OthrMain() {
setTitle("Menu");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 425);
setLocationByPlatform(true);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mnSales = new JMenu("Sales");
menuBar.add(mnSales);
JMenuItem mntmProcessSale = new JMenuItem("Generate Sales Invoice");
mntmProcessSale.addActionListener(e -> {
if (saleDlg == null) {
saleDlg = new Sale(this);
}
saleDlg.setVisible(true);
});
mnSales.add(mntmProcessSale);
}
public static class Sale extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
private final JTable table;
private Price priceDlg;
public Sale(JFrame sale) {
super(sale);
setTitle("Sale");
setSize(400, 400);
setLocationRelativeTo(sale);
JPanel topPanel = new JPanel();
lbl = new JLabel("Select Item");
topPanel.add(lbl);
String[] item = {"A", "B", "C", "D"};
combobox = new JComboBox<>(item);
combobox.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (priceDlg == null) {
priceDlg = new Price(Sale.this);
}
priceDlg.setVisible(true);
}
});
combobox.setSelectedIndex(-1);
topPanel.add(combobox);
add(topPanel, BorderLayout.PAGE_START);
JScrollPane scrollPane = new JScrollPane();
add(scrollPane, BorderLayout.CENTER);
table = new JTable();
table.setModel(new DefaultTableModel(new Object[][]{},
new String[]{"Item", "Price", "Qty"}));
scrollPane.setViewportView(table);
}
public void filltable(Object price, Object qty) {
Object[] row = new Object[3];
row[0] = combobox.getSelectedItem();
combobox.setSelectedIndex(-1);
row[1] = price;
row[2] = qty;
DefaultTableModel tm1 = (DefaultTableModel) table.getModel();
tm1.addRow(row);
}
}
public static class Price extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
private Qty qtyDlg;
public Price(JDialog price) {
super(price);
setTitle("Price");
setSize(300, 300);
setLocationRelativeTo(price);
JPanel panel = new JPanel();
lbl = new JLabel("Select Price");
panel.add(lbl);
String[] prices = {"5", "10", "20", "30"};
combobox = new JComboBox<>(prices);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (qtyDlg == null) {
qtyDlg = new Qty(Price.this);
}
qtyDlg.setVisible(true);
}
}
});
combobox.setSelectedIndex(-1);
panel.add(combobox);
add(panel, BorderLayout.PAGE_START);
}
public void clearPrice() {
combobox.setSelectedIndex(-1);
}
public Object getPrice() {
return combobox.getSelectedItem();
}
}
public static class Qty extends JDialog {
private JComboBox<String> combobox;
private JLabel lbl;
public Qty(JDialog qty) {
super(qty);
setTitle("Qty");
setSize(300, 300);
setLocationRelativeTo(qty);
JPanel contentPane2 = new JPanel();
lbl = new JLabel("Select Qty");
contentPane2.add(lbl);
String[] Qty = {"1", "2", "3", "4"};
combobox = new JComboBox<>(Qty);
combobox.addItemListener(this::fillTable);
combobox.setSelectedIndex(-1);
contentPane2.add(combobox);
add(contentPane2);
}
public void fillTable(ItemEvent event) {
if (event.getStateChange() == ItemEvent.SELECTED) {
Object qty = combobox.getSelectedItem();
combobox.setSelectedIndex(-1);
Object price = ((Price) getOwner()).getPrice();
((Price) getOwner()).clearPrice();
((Sale) getOwner().getOwner()).filltable(price, qty);
setVisible(false);
getOwner().setVisible(false);
}
}
}
}