一、 有潜在BUG,需要等待时间才能看到效果
minitable.setMultiSelection(true);
//
minitable.getTableHeader().setReorderingAllowed(false);
minitable.getTableHeader().setResizingAllowed(false);
private int Index_Carton_ID;
private int m_CarRow1 = -1;
private int m_CarRow2 = -1;
//------------------------------methods
public void tableChanged(TableModelEvent e) {
int row = 0;
int col = 0;
int editRow = 0;
int editCol = e.getColumn();
boolean isCartonsTable = (e.getSource().equals(minitable.getModel()));
if (isCartonsTable) {
row = minitable.getRowCount();
col = minitable.getColumnCount();
editRow = minitable.getEditingRow();
if (editRow < 0 || editCol < 0) {
return;
}
}
// if minitable change and eiditing Column be zero.
if(isCartonsTable && row > 0 && editCol == 0){
TableModel tableModel = miniTable.getModel();
// for minitable,Row set not selected.
for (int i = 0; i < minitable.getRowCount(); i++) {
((IDColumn) tableModel.getValueAt(i, Index_Carton_ID)).setSelected(false);
}
//
IDColumn ids = (IDColumn) tableModel.getValueAt(editRow, Index_Carton_ID);
if (m_CarRow1 == editRow && m_CarRow2 != editRow) {
ids.setSelected(false);
m_CarRow2 = editRow;
} else {
ids.setSelected(true);
m_CarRow2 = -1;
}
}
}
二、 使用Boolean类型为第一列测试技术为Compiere/ADempiere
效果根据Parameter Apanel 输入的参数查询Header Apanel 数据。
然后选择 Header Apanel 中的一行 查询出 Lines Apanel
且显示出 所选择的Header Apanel 数据的 Currency 、Payment Term、 Shipment Term.
package org.compiere.apps.form;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.ColorModel;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import org.compiere.apps.ConfirmPanel;
import org.compiere.apps.StatusBar;
import org.compiere.minigrid.IDColumn;
import org.compiere.minigrid.MiniTable;
import org.compiere.minigrid.MiniTableColor;
import org.compiere.plaf.CompiereColor;
import org.compiere.swing.CLabel;
import org.compiere.swing.CPanel;
import org.compiere.swing.CTextField;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.compiere.util.Trx;
public class VCompletePO extends CPanel implements FormPanel, ActionListener, MouseListener {
/**
*
*/
private static final long serialVersionUID = -1875564139294965533L;
/**
* Initialize Panel
*
* @param WindowNo
* window
* @param frame
* frame
*/
public void init(int WindowNo, FormFrame frame) {
log.info("");
m_WindowNo = WindowNo;
m_frame = frame;
AD_Form_ID = m_frame.getAD_Form_ID();
m_frame.setLocation(50, 50);
try {
fillPicks();
jbInit();
dynInit();
frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
frame.getContentPane().add(statusBar, BorderLayout.SOUTH);
} catch (Exception ex) {
log.log(Level.SEVERE, "init", ex);
}
} // init
/** Window No */
private int m_WindowNo = 0;
/** FormFrame */
private FormFrame m_frame;
/** Form ID */
private int AD_Form_ID = 0;
private Trx trx = Trx.get(Trx.createTrxName("AL"), true);
// -------------------------------------------------------------------------------------
/** Logger */
private static CLogger log = CLogger.getCLogger(VUpdateCPCByProduct.class);
// -----------------------------------------------------------------------
private CLabel lDocNo = new CLabel();
private CTextField fDocNo = new CTextField();
private CLabel lBPartner = new CLabel();
private CTextField fBPartner = new CTextField();
// -----------------------------------------------------------------------
private CLabel lCurrency = new CLabel();
private CTextField fCurrency = new CTextField();
private CLabel lPayTerm = new CLabel();
private CTextField fPayTerm = new CTextField();
private CLabel lShipTerm = new CLabel();
private CTextField fShipTerm = new CTextField();
// ---------------------------------------------------------------------------------------
private int INDEX_H_Boolean = 0;
private int INDEX_H_DocNo = 1;
private int INDEX_H_Currency = 2;
private int INDEX_H_PayTerm = 3;
private int INDEX_H_ShipTerm = 4;
private int INDEX_L_ID = 0;
private int INDEX_L_Line = 1;
private int INDEX_L_Product = 2;
private int INDEX_L_CPC = 3;
private int INDEX_L_VPC = 4;
// -----------------------------------------------------------------------
private CPanel mainPanel = new CPanel();
private BorderLayout mainPanelLayout = new BorderLayout();
// North Panel
private CPanel northPanel = new CPanel();
private GridBagLayout northPanelLayout = new GridBagLayout();
// Center Panel
private CPanel centerPanel = new CPanel();
private BorderLayout centerPanelLayout = new BorderLayout();
// Center Panel --> Header Panel
private JScrollPane headerPanel = new JScrollPane();
private MiniTable HeaderTable = new MiniTable();
// Center Panel --> Search Pable
private CPanel searchPanel = new CPanel();
private BorderLayout searchPanelLayout = new BorderLayout();
// Search Panel --> Description Pable
private CPanel descPanel = new CPanel();
private GridBagLayout descPanelLayout = new GridBagLayout();
// Search Panel --> Lines Panel
private JScrollPane linesPanel = new JScrollPane();
private MiniTableColor linesTable = new MiniTableColor();
/** Delete Button */
private ConfirmPanel confirmPanelSel = new ConfirmPanel(true, true, false,
false, false, false, false);
private StatusBar statusBar = new StatusBar();
/**
* Static Init.
*
* <pre>
* selPanel (tabbed)
* fOrg, fBPartner
* scrollPane & miniTable
* genPanel
* info
* </pre>
*
* @throws Exception
*/
void jbInit() throws Exception {
CompiereColor.setBackground(this);
// --------------------------------------------------------------------
lDocNo.setLabelFor(fDocNo);
lBPartner.setLabelFor(fBPartner);
lCurrency.setLabelFor(fCurrency);
lPayTerm.setLabelFor(fPayTerm);
lShipTerm.setLabelFor(lShipTerm);
mainPanel.setName("mainPanel");
mainPanel.setLayout(mainPanelLayout);
/** Main Panel --> Parameter Panel */
mainPanel.add(northPanel, BorderLayout.NORTH);
northPanel.setLayout(northPanelLayout);
TitledBorder border = new TitledBorder(" Parameter ");
northPanel.setBorder(border);
// 0,0 --> 1,0
northPanel.add(lDocNo, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5,
5, 5, 5), 0, 0));
northPanel.add(fDocNo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5,
0, 5, 5), 0, 0));
northPanel.add(lBPartner, new GridBagConstraints(2, 0, 1, 1, 0.0,
0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 0, 0));
northPanel.add(fBPartner, new GridBagConstraints(3, 0, 1, 1, 0.0,
0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(5, 0, 5, 5), 0, 0));
/** Main Panel --> Center Panel */
mainPanel.add(centerPanel, BorderLayout.CENTER);
centerPanel.setLayout(centerPanelLayout);
/** Center Panel --> Header Panel */
centerPanel.add(headerPanel, BorderLayout.WEST);
border = new TitledBorder(" Header ");
headerPanel.setBorder(border);
headerPanel.getViewport().add(HeaderTable, null);
/** Center Panel --> Search Panel */
centerPanel.add(searchPanel, BorderLayout.EAST);
searchPanel.setLayout(searchPanelLayout);
/** Search Panel --> Description Panel */
searchPanel.add(descPanel, BorderLayout.NORTH);
descPanel.setLayout(descPanelLayout);
border = new TitledBorder(" Description ");
descPanel.setBorder(border);
// 0,0 --> 3,0
descPanel.add(lCurrency, new GridBagConstraints(0, 0, 1, 1, 0.0,
0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 0, 0));
descPanel.add(fCurrency, new GridBagConstraints(1, 0, 1, 1, 0.0,
0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(5, 0, 5, 5), 0, 0));
descPanel.add(lPayTerm, new GridBagConstraints(2, 0, 1, 1, 0.0,
0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 0, 0));
descPanel.add(fPayTerm, new GridBagConstraints(3, 0, 1, 1, 0.0,
0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(5, 0, 5, 5), 0, 0));
// 0,1 --> 3,1
descPanel.add(lShipTerm, new GridBagConstraints(0, 1, 1, 1, 0.0,
0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets(5, 5, 5, 5), 0, 0));
descPanel.add(fShipTerm, new GridBagConstraints(1, 1, 1, 1, 0.0,
0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(5, 0, 5, 5), 0, 0));
/** Search Panel --> Lines Panel */
searchPanel.add(linesPanel, BorderLayout.CENTER);
border = new TitledBorder(" Lines ");
linesPanel.setBorder(border);
linesPanel.getViewport().add(linesTable, null);
// ---------------------- Main Panel --> South Panel
// ----------------------
mainPanel.add(confirmPanelSel, BorderLayout.SOUTH);
confirmPanelSel.addActionListener(this);
} // jbInit
/**
* Fill Picks.
*
* @throws Exception
* if Lookups cannot be initialized
*/
private void fillPicks() throws Exception {
//
lDocNo.setText(Msg.translate(Env.getCtx(), "DocumentNo"));
fDocNo.setName("DocNo Field");
fDocNo.setColumns(15);
//
lBPartner.setText("BPartner Value");
fBPartner.setName("BPartner Field");
fBPartner.setColumns(15);
//
lCurrency.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
fCurrency.setName("Currency Field");
fCurrency.setColumns(15);
fCurrency.setReadWrite(false);
//
lPayTerm.setText(Msg.translate(Env.getCtx(), "C_PaymentTerm_ID"));
fPayTerm.setName("PayTerm Field");
fPayTerm.setColumns(15);
fPayTerm.setReadWrite(false);
//
lShipTerm.setText(Msg.translate(Env.getCtx(), "KF_ShipTerm_ID"));
fShipTerm.setName("ShipTerm Field");
fShipTerm.setColumns(15);
fShipTerm.setReadWrite(false);
} // fillPicks
/**
* Dynamic Init. - Create GridController & Panel - AD_Column_ID from C_Order
*/
private void dynInit() {
// create Columns
HeaderTable.addColumn("IDNumber");
HeaderTable.addColumn(Msg.translate(Env.getCtx(), "DocumentNo"));
HeaderTable.addColumn("");
HeaderTable.addColumn("");
HeaderTable.addColumn("");
//
//HeaderTable.setMultiSelection(true);
//HeaderTable.setRowSelectionAllowed(true);
// set details
HeaderTable.setColumnClass(INDEX_H_Boolean, Boolean.class, true, " ");
HeaderTable.setColumnClass(INDEX_H_DocNo, KeyNamePair.class, true, Msg
.translate(Env.getCtx(), "DocumentNo"));
HeaderTable.setColumnClass(INDEX_H_Currency, KeyNamePair.class, true, "");
HeaderTable.setColumnClass(INDEX_H_PayTerm, KeyNamePair.class, true, "");
HeaderTable.setColumnClass(INDEX_H_ShipTerm, KeyNamePair.class, true, "");
HeaderTable.autoSize();
//HeaderTable.getModel().addTableModelListener(this);
HeaderTable.addMouseListener(this);
HeaderTable.getTableHeader().setReorderingAllowed(false);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_Currency).setMaxWidth(0);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_Currency).setMinWidth(0);
TableColumnModel cm = HeaderTable.getColumnModel();
TableColumn tc = cm.getColumn(INDEX_H_Currency);
tc.setMaxWidth(0);
tc.setPreferredWidth(0);
tc.setWidth(0);
tc.setMinWidth(0);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_PayTerm).setMaxWidth(0);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_PayTerm).setMinWidth(0);
tc = cm.getColumn(INDEX_H_PayTerm);
tc.setMaxWidth(0);
tc.setPreferredWidth(0);
tc.setWidth(0);
tc.setMinWidth(0);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_ShipTerm).setMaxWidth(0);
HeaderTable.getTableHeader().getColumnModel().getColumn(INDEX_H_ShipTerm).setMinWidth(0);
tc = cm.getColumn(INDEX_H_ShipTerm);
tc.setMaxWidth(0);
tc.setPreferredWidth(0);
tc.setWidth(0);
tc.setMinWidth(0);
// create Columns
linesTable.addColumn("IDNumber");
linesTable.addColumn(Msg.translate(Env.getCtx(), "Line"));
linesTable.addColumn(Msg.translate(Env.getCtx(), "M_Product_ID"));
linesTable.addColumn(Msg.translate(Env.getCtx(), "KF_ProductCPC_ID"));
linesTable.addColumn(Msg.translate(Env.getCtx(), "KF_ProductVPC_ID"));
//
//linesTable.setMultiSelection(true);
//linesTable.setRowSelectionAllowed(true);
// set details
linesTable.setColumnClass(INDEX_L_ID, IDColumn.class, false, " ");
linesTable.setColumnClass(INDEX_L_Line, KeyNamePair.class, true, Msg
.translate(Env.getCtx(), "Line"));
linesTable.setColumnClass(INDEX_L_Product, KeyNamePair.class, true, Msg
.translate(Env.getCtx(), "M_Product_ID"));
linesTable.setColumnClass(INDEX_L_CPC, KeyNamePair.class, true, Msg
.translate(Env.getCtx(), "KF_ProductCPC_ID"));
linesTable.setColumnClass(INDEX_L_VPC, KeyNamePair.class, true, Msg
.translate(Env.getCtx(), "KF_ProductVPC_ID"));
linesTable.autoSize();
linesTable.getTableHeader().setReorderingAllowed(false);
// Info
statusBar.setStatusLine("");// @@
statusBar.setStatusDB(" ");
} // dynInit
/**
* Query Info
*/
private void showHeader() {
log.info("");
//
HeaderTable.setRowCount(0);
//
StringBuffer sql = new StringBuffer(
" Select o.C_Order_ID,o.DocumentNo,"
+ " cur.C_Currency_ID,cur.Iso_Code,"
+ " pt.C_PaymentTerm_ID,pt.name,"
+ " st.KF_ShipTerm_ID,st.name"
+ " From C_Order o"
+ " Left Join C_BPartner bp on(bp.C_BPartner_ID = o.C_BPartner_ID)"
+ " Left Join C_Currency cur on(cur.C_Currency_ID = o.C_Currency_ID)"
+ " Left Join C_PaymentTerm pt on(pt.C_PaymentTerm_ID = o.C_PaymentTerm_ID)"
+ " Left Join KF_ShipTerm st on(st.KF_ShipTerm_ID = o.KF_ShipTerm_ID)"
+ " Where o.DocStatus in('DR','IP') and o.IsSOTrx = 'N'");
if (fDocNo.getText().length() > 0)
sql.append(" AND UPPER(o.DocumentNo) LIKE ?");
if (fBPartner.getText().length() > 0)
sql.append(" AND UPPER(bp.Value) LIKE ?");
//
sql.append(" ORDER BY O.DocumentNo");
log.fine(sql.toString());
// reset table
int row = 0;
linesTable.setRowCount(row);
// Execute
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = DB.prepareStatement(sql.toString(), trx.getTrxName());
//
int index = 1;
if (fDocNo.getText().length() > 0)
pstmt.setString(index++, getSQLText(fDocNo));
if (fBPartner.getText().length() > 0)
pstmt.setString(index++, getSQLText(fBPartner));
//
rs = pstmt.executeQuery();
while (rs.next()) {
// extend table
HeaderTable.setRowCount(row + 1);
// set values
int C_Order_ID = rs.getInt(1);
if(row == 0){
m_C_Order_ID = C_Order_ID;
alfer_SelRow = 0;
}
//HeaderTable.setValueAt(new IDColumn(C_Order_ID), row, INDEX_H_ID); //
// DocumentNo -> KeyNamePair
KeyNamePair knp = new KeyNamePair(C_Order_ID, rs.getString(2));
HeaderTable.setValueAt(knp, row, INDEX_H_DocNo);
//
knp = new KeyNamePair(rs.getInt(3), rs.getString(4));
HeaderTable.setValueAt(knp, row, INDEX_H_Currency);
//
knp = new KeyNamePair(rs.getInt(5), rs.getString(6));
HeaderTable.setValueAt(knp, row, INDEX_H_PayTerm);
//
knp = new KeyNamePair(rs.getInt(7), rs.getString(8));
HeaderTable.setValueAt(knp, row, INDEX_H_ShipTerm);
// prepare next
row++;
}
rs.close();
pstmt.close();
} catch (SQLException e) {
System.out.println(e);
log.log(Level.SEVERE, sql.toString(), e);
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
} catch (SQLException e) {
}
}
pstmt = null;
rs = null;
//
HeaderTable.autoSize();
if(HeaderTable.getRowCount() > 0) {
executeQuery();
}
} // showHeader
/**
* Query Info
*/
private void executeQuery() {
log.info("");
//
HeaderTable.setValueAt(true, alfer_SelRow, 0);
//
StringBuffer sql = new StringBuffer(
" Select ol.C_OrderLine_ID,ol.Line,prd.M_Product_ID,prd.Value,"
+ " cpc.KF_ProductCPC_ID,cpc.Name,"
+ " vpc.KF_ProductvPC_ID,vpc.Name"
+ " From C_OrderLine ol"
+ " Left Join M_Product prd on(prd.M_Product_ID = ol.M_Product_ID)"
+ " Left Join KF_ProductCPC cpc on(cpc.KF_ProductCPC_ID = ol.kf_cpc)"
+ " Left Join KF_ProductVPC vpc on(vpc.KF_ProductVPC_ID = ol.kf_vpc)"
+ " Left Join C_Currency cur on(cur.C_Currency_ID = ol.C_Currency_ID)"
+ " Where ol.C_Order_ID = ?");
//
sql.append(" ORDER BY ol.Line");
log.fine(sql.toString());
// reset table
int row = 0;
linesTable.setRowCount(row);
// Execute
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = DB.prepareStatement(sql.toString(), trx.getTrxName());
pstmt.setInt(1, m_C_Order_ID);
rs = pstmt.executeQuery();
while (rs.next()) {
// extend table
linesTable.setRowCount(row + 1);
// set values
int c_OrderLine_ID = rs.getInt(1);
linesTable.setValueAt(new IDColumn(c_OrderLine_ID), row, 0); //
// Line
linesTable.setValueAt(rs.getInt(2), row, 1);
// Product Value -> KeyNamePair
KeyNamePair knp = new KeyNamePair(rs.getInt(3), rs.getString(4));
linesTable.setValueAt(knp, row, 2);
// CPC -> KeyNamePair
knp = new KeyNamePair(rs.getInt(5), rs.getString(6));
linesTable.setValueAt(knp, row, 3);
// VPC -> KeyNamePair
knp = new KeyNamePair(rs.getInt(7), rs.getString(8));
linesTable.setValueAt(knp, row, 4);
// prepare next
row++;
}
rs.close();
pstmt.close();
} catch (SQLException e) {
System.out.println(e);
log.log(Level.SEVERE, sql.toString(), e);
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
} catch (SQLException e) {
}
}
pstmt = null;
rs = null;
//
linesTable.autoSize();
} // executeQuery
/**
* Dispose
*/
public void dispose() {
if (m_frame != null)
m_frame.dispose();
m_frame = null;
// trx.close();
} // dispose
/**
* Get SQL WHERE parameter
*
* @param f
* field
* @return sql
*/
private String getSQLText(CTextField f) {
String s = f.getText().toUpperCase();
//if (!s.endsWith("%"))
// s += "%";
log.fine("String=" + s);
return s;
} // getSQLText
public void actionPerformed(ActionEvent e) {
log.info("Cmd=" + e.getActionCommand());
log.fine("actionPerformed e ============= " + e.getActionCommand());
//
if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL)) {
// Env.setContext(Env.getCtx(), "trxName", "");
dispose();
return;
}
if (e.getActionCommand().equals(ConfirmPanel.A_REFRESH)) {
// miniTable.editingStopped(new ChangeEvent(this));
showHeader();
return;
}
}
private int m_C_Order_ID = 0;
private int alfer_SelRow = -1;
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 0 && HeaderTable.getSelectedRow() != -1)
{
//
HeaderTable.setValueAt(false, alfer_SelRow, 0);
//
int editRow = HeaderTable.getSelectedRow();
Object data = HeaderTable.getModel().getValueAt(editRow, INDEX_H_DocNo);
if (data instanceof KeyNamePair)
m_C_Order_ID = ((KeyNamePair)data).getKey();
KeyNamePair knp = null;
Object value = HeaderTable.getValueAt(editRow, INDEX_H_Currency);
if(value != null){
knp = (KeyNamePair)value;
fCurrency.setValue(knp.getName());
}
value = HeaderTable.getValueAt(editRow, INDEX_H_PayTerm);
if(value != null){
knp = (KeyNamePair)value;
fCurrency.setValue(knp.getName());
}
value = HeaderTable.getValueAt(editRow, INDEX_H_ShipTerm);
if(value != null){
knp = (KeyNamePair)value;
fCurrency.setValue(knp.getName());
}
//
alfer_SelRow = editRow;
//
executeQuery();
}
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
</pre></p><p><pre name="code" class="java">