두 개의 JTable 및 관련 데이터를 관리하는 데 몇 가지 문제가 있습니다. 나는 차량의 목록 (트럭, 자동차 ...) 및 상대 정보를 가지고있는 첫 번째의 JTable에서 : JTable, TableModel 및 기타의 복잡한 사용
내가 사용 설명 :
나는이 GUI를 확인했다. 두 번째 jTable에는 녹색 화살표를 눌러서 "사용 가능"(즉, 에이전트가 시작됨)하려는 차량 목록이 있습니다. 첫 번째 목록의 하위 목록은 첫 번째 테이블에서 선택한 행이 두 번째 목록에 복사됩니다.첫 번째 문제 : 첫 번째 열에는 차량 종류 (이 예에서는 트럭을 볼 수 있음)에 대한 설명 이미지가 있습니다. 세 번째와 다섯 번째 열에는 다른 jComboBox가 있습니다. TIPO VEICOLO의 jComboBox (즉 Kind)를 참조하십시오 : 다른 차량을 선택하면 첫 번째 열의 이미지가 변경되어야합니다! (트럭에서 자동차로 변경하려면 상대 아이콘이 변경되어야 함). 또한 소프트웨어의 다른 위치에서이 아이콘을 처리하지 않을 수도 있습니다. 나는 설명 : 내가 사용하려는
Object[] vehicle = {"aaa", "kind1", "marca", "disponibile", "ptt" }
및
Object[] vehicle = {"/image/truck.png" ,"aaa", "kind1", "marca", "disponibile", "ptt" }
두 번째 문제
결코 : 나는 JTable의 다른 기능을 추가하고자하는 미래에 : 치수, 차량의 색상, 라이센스를 ... 알 수 없습니다 트럭의 기능은 자동차의 기능과 다릅니다. 헤더의 모든 기능을 유지하는 방법을 원하지만 모든 종류의 차량에 따라 일부 셀을 활성화/비활성화 할 수 있습니다.참고 : jTables의 헤더가 필요하지 않습니다 같은
package it.transfersimulation;
import it.transfersimulation.Vehicle.Stato;
import it.transfersimulation.Vehicle.TipoVeicolo;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.ComponentOrientation;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.BoxLayout;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.SwingConstants;
@SuppressWarnings("serial")
public class ShipperAgentGUI extends JFrame implements ActionListener {
// Variabili di classe
private JPanel masterPanel;
private JButton btnPM_plus;
private JButton btnPM_meno;
private JButton btnMD_plus;
private JButton btnMD_meno;
private JTable availablesTable;
private JTable parkTable;
private Object[] parkModelHeader = { "" , "TARGA", "TIPO VEICOLO", "MARCA", "STATO", "PTT" };
private Object[] availablesModelHeader = { "", "TARGA", "TIPO VEICOLO", "MARCA", "STATO", "PTT" };
private DefaultTableModel parkModel = new DefaultTableModel(null, parkModelHeader){
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
};
};// per aggiungere jCheckBox, jComboBox e ImageIcon
private DefaultTableModel availablesModel = new DefaultTableModel(null, availablesModelHeader){
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
};
};// per aggiungere jCheckBox, jComboBox e ImageIcon
// My third-part software: a JADE agent:
protected ShipperAgent shipperAgent;
private Coordinator parkCoordinator;
private Coordinator availablesCoordinator;
////////////////////////////////////////////////////
// COSTRUTTORE
ShipperAgentGUI(ShipperAgent agent) {
// Valorizza l'agente corrispondente
shipperAgent = agent;
///////////////////////////////////////////////////////////////////////
// Graphics:
//
setTitle("Shipper Agent: "+agent.getLocalName());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
// MasterPanel
masterPanel = new JPanel();
masterPanel.setLayout(new BoxLayout(masterPanel, BoxLayout.Y_AXIS));
masterPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
// Park Panel
JPanel parkPanel = new JPanel();
parkPanel.setLayout(new BoxLayout(parkPanel, BoxLayout.Y_AXIS));
masterPanel.add(parkPanel);
JPanel pnlHeaderParkPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JLabel parkLabel = new JLabel("Parco auto:");
pnlHeaderParkPanel.add(parkLabel);
parkPanel.add(pnlHeaderParkPanel);
JPanel pnlTableParkPanel = new JPanel();
pnlTableParkPanel.setLayout(new BoxLayout(pnlTableParkPanel, BoxLayout.X_AXIS));
parkPanel.add(pnlTableParkPanel);
// Park Table
parkTable = new JTable();
parkTable.setModel(parkModel);
parkTable.setPreferredScrollableViewportSize(new Dimension(500,100));
parkTable.setFillsViewportHeight(true);
JScrollPane parkScrollPane = new JScrollPane(parkTable);
pnlTableParkPanel.add(parkScrollPane);
JPanel pnlBtnParkPanel = new JPanel();
pnlTableParkPanel.add(pnlBtnParkPanel);
pnlBtnParkPanel.setLayout(new BoxLayout(pnlBtnParkPanel, BoxLayout.Y_AXIS));
// JButtons: add/remove vehicle in Park Table
btnPM_plus = new JButton();
btnPM_plus.setToolTipText("Aggiungi mezzo");
btnPM_plus.setIcon(new ImageIcon(ShipperAgentGUI.class.getResource("/images/lorry-add.png")));
btnPM_plus.setActionCommand("+parco");
btnPM_plus.addActionListener(this);
pnlBtnParkPanel.add(btnPM_plus);
btnPM_meno = new JButton();
btnPM_meno.setToolTipText("Rimuovi mezzo");
btnPM_meno.setIcon(new ImageIcon(ShipperAgentGUI.class.getResource("/images/lorry-delete.png")));
btnPM_meno.setActionCommand("-parco");
btnPM_meno.addActionListener(this);
pnlBtnParkPanel.add(btnPM_meno);
// Arrow Panel
JPanel arrowPanel = new JPanel();
masterPanel.add(arrowPanel);
// JButtons: available or not vehicle
btnMD_plus = new JButton();
btnMD_plus.setToolTipText("Rendi disponibile il mezzo selezionato");
btnMD_plus.setIcon(new ImageIcon(ShipperAgentGUI.class.getResource("/images/arrow-green-down.png")));
arrowPanel.add(btnMD_plus);
btnMD_plus.setActionCommand("+disponibili");
btnMD_plus.addActionListener(this);
btnMD_meno = new JButton();
btnMD_meno.setToolTipText("Rendi indisponibile il mezzo selezionato");
btnMD_meno.setIcon(new ImageIcon(ShipperAgentGUI.class.getResource("/images/arrow-red-up.png")));
arrowPanel.add(btnMD_meno);
btnMD_meno.setActionCommand("-disponibili");
btnMD_meno.addActionListener(this);
// Availables Panel
JPanel availablesPanel = new JPanel();
masterPanel.add(availablesPanel);
availablesPanel.setLayout(new BoxLayout(availablesPanel, BoxLayout.Y_AXIS));
JPanel pnlHeaderAvailablesPanel = new JPanel();
FlowLayout fl_pnlHeaderAvailablesPanel = (FlowLayout) pnlHeaderAvailablesPanel.getLayout();
fl_pnlHeaderAvailablesPanel.setAlignment(FlowLayout.LEFT);
availablesPanel.add(pnlHeaderAvailablesPanel);
JLabel label_1 = new JLabel("Disponibili:");
pnlHeaderAvailablesPanel.add(label_1);
label_1.setHorizontalAlignment(SwingConstants.LEFT);
// Available Table
availablesTable = new JTable();
availablesTable.setModel(availablesModel);
availablesTable.setPreferredScrollableViewportSize(new Dimension(500, 100));
availablesTable.setFillsViewportHeight(true);
JScrollPane availablesScrollPane = new JScrollPane(availablesTable);
availablesPanel.add(availablesScrollPane);
getContentPane().add(masterPanel, BorderLayout.CENTER);
// Search Panel
JPanel searchPanel = new JPanel();
masterPanel.add(searchPanel);
JButton btnSearch = new JButton("Search");
searchPanel.add(btnSearch);
// End of graphics init
///////////////////////////////////
//////////////////////////////////////
// Editor delle colonne delle tabelle
// TODO
JComboBox<TipoVeicolo> tipoVeicoloComboBox = new JComboBox<TipoVeicolo>();
tipoVeicoloComboBox.setModel(new DefaultComboBoxModel<TipoVeicolo>(TipoVeicolo.values()));
JComboBox<Stato> statoComboBox = new JComboBox<Stato>();
statoComboBox.setModel(new DefaultComboBoxModel<Stato>(Stato.values()));
TableColumn tipoVeicoloColumn = parkTable.getColumnModel().getColumn(2);
TableColumn statoColumn = parkTable.getColumnModel().getColumn(4);
tipoVeicoloColumn.setCellEditor(new DefaultCellEditor(tipoVeicoloComboBox));
statoColumn.setCellEditor(new DefaultCellEditor(statoComboBox));
/////////////////////////////////////////////////////////////////////
// Coordinators (ispirati al Mediator pattern)
parkCoordinator = new Coordinator(shipperAgent, parkModel) {
@Override
public void notifyAndAddRow(final Object[] rowData) {
shipperAgent.newTruck((String) rowData[0]);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.addRow(rowData);
}
});
}
@Override
public void notifyAndDeleteRow(final int rowIndex) {
final String truck = (String)this.tableModel.getValueAt(rowIndex, 0);
int flag=search(availablesCoordinator.tableModel, truck);
if (flag!=-1)
removeVehicle(availablesCoordinator, flag);
shipperAgent.removeTruck(truck);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.removeRow(rowIndex);
}
});
}
};
availablesCoordinator = new Coordinator(shipperAgent, availablesModel) {
@Override
public void notifyAndAddRow(final Object[] rowData) {
shipperAgent.activateTruck((String) rowData[0]);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.addRow(rowData);
}
});
}
@Override
public void notifyAndDeleteRow(final int rowIndex) {
String truck = (String)this.tableModel.getValueAt(rowIndex, 1);
shipperAgent.deactivateTruck(truck);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
tableModel.removeRow(rowIndex);
}
});
}
};
/////////////////////////////////////////////////////
// Listeners:
parkModel.addTableModelListener(parcoListener);
availablesModel.addTableModelListener(mezziDisponibiliListener);
/////////////////////////////////////////////////////
// Contatto con l'agente - Riempimento dati
// TODO
Object[] veicoli = shipperAgent.getVehicles();
for (int i=0; i<veicoli.length;i++){
Object[] info = (Object[]) veicoli[i];
Object[] veicolo = new Object[info.length+1];
veicolo[0] = new ImageIcon(ShipperAgentGUI.class.getResource("/images/lorry-icon.png"));
for (int j=1;j<info.length+1;j++){
veicolo[j]=info[j-1];
}
parkModel.addRow(veicolo);
if (veicolo[4] == Stato.DISPONIBILE)
availablesModel.addRow(veicolo);
}
////////////////////////////
// Show GUI
showGui();
}
public void showGui() {
pack();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int centerX = (int) screenSize.getWidth()/2;
int centerY = (int) screenSize.getHeight()/2;
setLocation(centerX - getWidth()/2, centerY - getHeight()/2);
super.setVisible(true);
}
//////////////////////////////////////////////
// actionPerformed
@Override
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()) {
case "+parco": {
new VehicleInsertJDialog(this, parkCoordinator);
} break;
case "-parco": {
int selectedRow = parkTable.getSelectedRow();
if (selectedRow != -1)
removeVehicle(parkCoordinator, selectedRow);
} break;
case "+disponibili": {
int selectedRow = parkTable.getSelectedRow();
if (selectedRow != -1){
//TODO controlla la consistenza
addVehicle(availablesCoordinator,
String.valueOf(parkModel.getValueAt(selectedRow, 0)),
String.valueOf(parkModel.getValueAt(selectedRow, 1)),
String.valueOf(parkModel.getValueAt(selectedRow, 2)),
String.valueOf(parkModel.getValueAt(selectedRow, 3)),
String.valueOf(parkModel.getValueAt(selectedRow, 4))
);
}
} break;
case "-disponibili": {
int selectedRow = availablesTable.getSelectedRow();
if (selectedRow != -1)
removeVehicle(availablesCoordinator, selectedRow);
} break;
default:
System.out.println("Imprevisto in actionPerformed()");
break;
}
}
// /////////////////////////////////////
// Add/Remove vehicles methods
public void addVehicle(Coordinator coordinator,
String targa, String tipo, String marca, String stato, String peso) {
coordinator.notifyAndAddRow(new Object[]{targa, tipo, marca, stato, peso});
}
public void removeVehicle(Coordinator coordinator, int index) {
coordinator.notifyAndDeleteRow(index);
}
// //////////////////////////////////////////
// LISTENER:
TableModelListener parcoListener = new TableModelListener() {
public void tableChanged(TableModelEvent e) {
switch (e.getType()) {
case (TableModelEvent.INSERT):
System.out.println("un inserimento in corso!"); break;
case (TableModelEvent.DELETE):
System.out.println("una cancellazione in corso!"); break;
case (TableModelEvent.UPDATE):
System.out.println("un aggiornamento in corso!"); break;
}
}
};
TableModelListener mezziDisponibiliListener = new TableModelListener() {
public void tableChanged(TableModelEvent e) {
switch (e.getType()) {
case (TableModelEvent.INSERT):
System.out.println("un inserimento in corso!"); break;
case (TableModelEvent.DELETE):
System.out.println("una cancellazione in corso!"); break;
case (TableModelEvent.UPDATE):
System.out.println("un aggiornamento in corso!"); break;
}
}
};
private int search(DefaultTableModel tableModel, String targa) {
int flag = -1;
for (int i=0; i<tableModel.getRowCount(); i++)
if (tableModel.getValueAt(i, 0).equals(targa))
flag=i;
return flag;
}
///////////////////////////////////////
// INNER CLASS
///////////////////////////////////////
protected abstract class Coordinator {
/*
* protected class members so subclasses can access these directly
*/
protected ShipperAgent shipperAgent;
protected DefaultTableModel tableModel;
public Coordinator(ShipperAgent sa, DefaultTableModel tm) {
shipperAgent = sa;
tableModel = tm;
}
public abstract void notifyAndAddRow(Object[] rowData);
public abstract void notifyAndDeleteRow(int rowIndex);
}
}
첫 번째 질문에서 특정 질문을 발견 할 수 없습니다. 두 번째 문제 –
불명확하면 죄송합니다. 첫 번째 질문에 대해서는 jTable에서 Icon을 사용하는 방법을 알고 싶지만 정보의 일부처럼 아이콘을 처리하고 싶지는 않습니다. 나는 jTable이 그 자체로 차량의 종류를 깨닫고 주행성의 아이콘을 바꾸기를 원합니다. 내가 어디에서 할 수 있니? – Gioce90