Servus Gemeinde,
die folgende Table soll in Row 10 eine farbliche Darstellung der Row 9 wiedergeben. Dabei gibt es in Row 9 zwei Begriffe (übergeben und gespeichert). Spalte 10 soll nun die Farben rot, oder grün darstellen.
Die Table funktioniert soweit prima.
Nach dem Laden der Werte ist alles wunderbar.
Row 9 Row 10
gespreichert String : gespeichert (Farbe grün)
übergeben String : übergeben (Farbe rot)
übergeben String : übergeben (Farbe rot)
Wenn ich in dieser Spalte den Stringwert der Spalte 9 wiedergebe, dann sortiert er dies genauso, wie es vorgesehen habe.
Wenn ich nun nach Spalte 9 sortiere (z.B. absteigend):
Row 9 Row 10
übergeben String : übergeben (Farbe grün)
gespreichert String : gespeichert (Farbe rot)
gespreichert String : gespeichert (Farbe rot)
Die Farbe bleibt trotz Sortieren an der gleichen Stelle, sprich gleichen Reihe.
die folgende Table soll in Row 10 eine farbliche Darstellung der Row 9 wiedergeben. Dabei gibt es in Row 9 zwei Begriffe (übergeben und gespeichert). Spalte 10 soll nun die Farben rot, oder grün darstellen.
Die Table funktioniert soweit prima.
Nach dem Laden der Werte ist alles wunderbar.
Row 9 Row 10
gespreichert String : gespeichert (Farbe grün)
übergeben String : übergeben (Farbe rot)
übergeben String : übergeben (Farbe rot)
Wenn ich in dieser Spalte den Stringwert der Spalte 9 wiedergebe, dann sortiert er dies genauso, wie es vorgesehen habe.
Wenn ich nun nach Spalte 9 sortiere (z.B. absteigend):
Row 9 Row 10
übergeben String : übergeben (Farbe grün)
gespreichert String : gespeichert (Farbe rot)
gespreichert String : gespeichert (Farbe rot)
Die Farbe bleibt trotz Sortieren an der gleichen Stelle, sprich gleichen Reihe.
Java:
package _Pol649;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.Timer;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import sun.tools.jconsole.inspector.TableSorter;
public class ReportDataTable extends JFrame implements Comparable <ReportData>{
private String[] indexString = new String []{"", "Datum", "Streifenart", "Status"};
private int selectedRow = 0;
Message msg = new Message();
private Timer messageTimer;
private boolean timerFlag = true;
public static ArrayList<ReportData> reportList = new ArrayList<ReportData>();
public static String[] reportStatus = {"übergeben", "korrigieren", "gespeichert"};
ReportLogData reportLog;
SystemData _Sys;
ErrorHelper _Error;
PropertyData _Data;
CheckFiles _Files;
JFrame _Main;
ReportData report;
JFrame frame = new JFrame ( "Übersicht der eigenen Vorgänge" );
// Unser TableModel (siehe unten)
final ReportModel model = new ReportModel();
// Das JTable initialisieren
public JTable table = new JTable( model );
JScrollPane scr_table = new JScrollPane(table);
// Buttons, damit das alles schöner aussieht.
final JButton bt_close = new JButton("zur Hauptansicht");
final JButton bt_open = new JButton("Vorgang öffnen");
final JButton bt_delete = new JButton("Vorgang löschen");
final JButton bt_send = new JButton("Vorgang übergeben");
BorderLayout box = new BorderLayout();
// Die Layout's für den unteren Bereich
GridLayout gridSouth = new GridLayout(2,1);
GridLayout gridSouthOne = new GridLayout(1,3);
GridLayout gridSouthTwo = new GridLayout(1,1);
GridLayout grid = new GridLayout(1,2);
JPanel panel = new JPanel();
JPanel south = new JPanel();
JPanel south1 = new JPanel();
JPanel south2 = new JPanel();
JPanel north = new JPanel();
JPanel center = new JPanel();
JPanel content = new JPanel();
JLabel entries = new JLabel();
JLabel lb_InfoWindow = new JLabel();
public JLabel lb_numberOfReports = new JLabel();
public ReportDataTable() {
this._Sys = SystemData.getInstance();
this._Error = ErrorHelper.getInstance();
this._Data = PropertyData.getInstance();
this._Files = CheckFiles.getInstance();
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//table.setDefaultRenderer( Point.class, new PointRender());
// Die Spaltenbreiten für die Table
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(0).setPreferredWidth(80);
columnModel.getColumn(1).setPreferredWidth(80);
columnModel.getColumn(2).setPreferredWidth(100);
columnModel.getColumn(3).setPreferredWidth(120);
columnModel.getColumn(4).setPreferredWidth(90);
columnModel.getColumn(5).setPreferredWidth(160);
columnModel.getColumn(6).setPreferredWidth(80);
columnModel.getColumn(7).setPreferredWidth(110);
columnModel.getColumn(8).setPreferredWidth(250);
columnModel.getColumn(9).setPreferredWidth(80);
columnModel.getColumn(10).setPreferredWidth(15);
// Den Buttons ein paar Reaktionen geben
bt_close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
closeWindow();
}
});
}
private void deleteLogData(ReportModel model){
model.deleteData();
}
public Container addComponentsToPane(){
/* Dieser Timer hat eine Laufzeit, die von _Sys.getTimerInfo() bestimmt wird.
* Nach dieser Zeit füllt er das InfoFenster (unten) mit einer
* Standardmeldung mit einem zusätzl. Zeitstempel
* Durch 'setRepeats(false) wird der Timer nach jedem Aufruf nur
* einmal aufgerufen.
*/
messageTimer = new Timer(_Sys.getTimerInfo(), new ActionListener() {
public void actionPerformed(final ActionEvent e) {
clearInfoWindow();
}
});
messageTimer.setRepeats(false);
Container pane = getContentPane();
// Zunächst wird das Hauptpanel erzeugt
panel.setLayout(box);
panel.setBorder(new EmptyBorder(20,20,20,20));
panel.setBackground(_Sys.getBackground());
panel.add( scr_table, BorderLayout.CENTER );
// Der TableRowSorter wird die Daten des Models sortieren
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
// Der Sorter muss dem JTable bekannt sein
table.setRowSorter( sorter );
// ... und der Sorter muss wissen, welche Daten er sortieren muss
sorter.setModel( model );
// hier kommt die Sortierung der Datumsspalte
sorter.setComparator(5, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int e = (Integer.parseInt(o1.substring(6,8))*10000) + (Integer.parseInt(o1.substring(3, 5))*100)+ (Integer.parseInt(o1.substring(0,2)));
int f = (Integer.parseInt(o2.substring(6,8))*10000) + (Integer.parseInt(o2.substring(3, 5))*100)+ (Integer.parseInt(o2.substring(0,2)));
if(e < f ){return 1;}
if(e == f ){return 0;}
if(e> f ){return -1;}
return 0;}});
sorter.allRowsChanged();
sorter.sort();
table.getColumnModel().getColumn(10).setCellRenderer(
new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component component = super
.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(1))) {
component.setBackground(_Sys.getTableYellow());
}
if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(0))) {
component.setBackground(_Sys.getTableRed());
}
if (model.getValueAt(row, 9).toString().equals(_Sys.getReportStatusText(2))) {
component.setBackground(_Sys.getTableGreen());
}
return component;
}
});
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// SelectionListener für die Table
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
setSelectedRow(table.getSelectedRow());
setButtonsVisible(model.getValueAt(table.getSelectedRow(), 9).toString());
}
});
table.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
int i = e.getClickCount();
if(i == 2){
if(!isTableSelect()){return;}
checkReport();
CollectionController controller = new CollectionController();
controller.getDateOfReport((String) model.getValueAt(table.getSelectedRow(), 11));
if(checkStatusForOpen( model.getValueAt(table.getSelectedRow(),9).toString())){
// ab hier muss das Öffnen in der Anwendung, oder als pdf-Datei ermöglicht werden
}
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
table.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(26));
north.setBorder(new EmptyBorder(50,50,50,50));
// Das untere Panel besteht aus zwei weiteren Panels (south1 und south2)
south.setBorder(new EmptyBorder(10,20,10,20));
south.setLayout(gridSouth);
south1.setLayout(gridSouthOne);
south1.setBorder(new EmptyBorder(30,80,30,80));
bt_close.setMnemonic('Z');
bt_close.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(30));
south1.add(bt_close, BorderLayout.SOUTH );
bt_open.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(35));
// Listener für das Öffnen von Vorgängen
bt_open.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// keine Auswahl
if(!isTableSelect()){return;}
checkReport();
if(checkStatusForOpen( model.getValueAt(table.getSelectedRow(),9).toString())){
// Wurde bereits ein Vorgang geöffnet
if(!ReportData.isOpen()){
// Handelt es sich dabei um die gleiche Vorgangsnummer
if(ReportData.sameReport(model.getValueAt(table.getSelectedRow(),11).toString())){
if(ReportData.isChanged()){ // Wurde an dem bestehenden Vorgang eine Änderung vorgenommen?
// Beide Vorgänge haben einen unterschiedlichen Inhalt
if(ReportData.overwriteReport()){ // Der geänderte Vorgang soll überschrieben werden.
loadSelectedReport();
}
else{ // Vorgang wird nicht überschrieben
_Error.getErrorMessage(508,
new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(),
_Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
return;
}
}
else{ // Der geöffnete Vorgang wurde nicht verändert
loadSelectedReport();
}
}
// Ein Vorgang mit einer anderen Vorgangsnummer ist bereits geöffnet
// Soll dieser Vorgang gespeichert werden?
else{
if(!ReportData.overwriteDifferentReport()){ // Vorgang wird nicht überschrieben
_Error.getErrorMessage(508,
new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(),
_Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
return;
}
else{ // Überschreiben
loadSelectedReport();
}
}
}
}
loadSelectedReport();
}
});
south1.add(bt_open, BorderLayout.SOUTH);
bt_delete.setForeground(Color.red);
bt_delete.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(34));
bt_delete.addActionListener(new ActionListener(){...
});
south1.add(bt_delete);
bt_send.setToolTipText(_Data.getToolTipTextsForButtons().elementAt(36));
bt_send.addActionListener(new ActionListener(){...
});
south1.add(bt_send);
south.add(south1);
south2.setLayout(gridSouthTwo);
// Das Aussehen der InfoBox
Border loweredbevel;
loweredbevel = BorderFactory.createLoweredBevelBorder();
lb_InfoWindow.setSize(new Dimension(300,300));
lb_InfoWindow.setBorder(loweredbevel );
lb_InfoWindow.setOpaque(true);
lb_InfoWindow.setBackground(_Sys.getBackground());
lb_InfoWindow.setForeground(Color.black);
msg.setText("<html>" + "" + "<br>" + "" + "<br>" +
"" + "<br> " + "" + "<br>" + "" + "<br>" + "</B/html>");
lb_InfoWindow.setText(msg.getText());
south2.add(lb_InfoWindow);
south.add(south2);
panel.add(north, BorderLayout.NORTH);
panel.add(south, BorderLayout.SOUTH);
pane.add(panel);
return pane;
}
public void createAndShowGUI1(JFrame main){
this._Main = main;
frame.setContentPane(addComponentsToPane());
frame.setSize(1260, 800);
frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE);
frame.setBackground(_Sys.getBackground());
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible( true );
model.deleteData();
reportList.clear();
ReportData.reportList.clear();
loadReportFromMainFile(model, "User", _Sys, _Files); // liest die Vorgänge des Anwenders aus der ....FileDataUser.txt ..
loadReportFromMainFile(model, "Main", _Sys, _Files); // .. und hier aus der FileDataMain.txt
}
public void sendReportToMain(String reportNumber){
...
}
public int compareTo(ReportData o) {
int obj = Integer.parseInt(o.getDateAsSimpleDateFormat().substring(0, 2) + o.getDateAsSimpleDateFormat().substring(3,5));
int th = Integer.parseInt(o.getDateAsSimpleDateFormat().substring(0, 2) + o.getDateAsSimpleDateFormat().substring(3,5));
if(th < obj ){
return -1;
}
if(th == obj ){
return 0;
}
if(th > obj ){
return 1;
}
return 0;
}
public void loadSelectedReport(){
...
}
public boolean checkStatusForOpen(String status){
if(status.equals(reportStatus[0])){return false;}
else return true;
}
public boolean checkReportStatusForOpen(int i){
if(reportStatus[i].equals(reportStatus[0])){
return false;
}
return true;
}
private void setButtonsVisible(String row){
if(row.equals("übergeben")){
this.bt_delete.setVisible(false);
this.bt_send.setVisible(false);
this.bt_open.setText("lesend öffnen");
}
if(row.equals("korrigieren")){
this.bt_delete.setVisible(false);
this.bt_send.setVisible(true);
this.bt_open.setText("öffnen");
this.bt_open.setVisible(true);
}
if(row.equals("gespeichert")){
this.bt_delete.setVisible(true);
this.bt_send.setVisible(true);
this.bt_open.setVisible(true);
this.bt_open.setText("öffnen");
}
}
private boolean checkReportStatusToDelete(){
if(!model.getValueAt(selectedRow, 9).equals(getReportStatus(2))){
_Error.getErrorMessage(503,
new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
return false;
}
else return true;
}
private boolean isTableSelect(){
// Ist ein Vorgang ausgewählt?
if(table.getSelectedRow()== -1){
_Error.getErrorMessage(502,
new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
return false;
}
return true;
}
private void checkReport(){
// Sollte der Vorgang den Status "übergeben" haben, so kann er nicht geöffnet werden
if(model.getValueAt(getSelectedRow(), 8).equals(getReportStatus(0))){
_Error.getErrorMessage(501,
new Exception().getStackTrace()[0].getClassName() + "/" + new Exception().getStackTrace()[0].getMethodName(),"");
setInfoText(_Error.getErrorClassification(), _Error.getErrorText1(), _Error.getErrorText2(), _Error.getErrorText3(), _Error.getErrorText4(), _Error.getExtraText());
}
}
private static String getReportStatus(int i){
return reportStatus[i];
}
private void setSelectedRow(int a){
selectedRow = a;
}
private int getSelectedRow(){
return selectedRow;
}
private void closeWindow(){
frame.setVisible(false);
_Main.setEnabled(true);
}
...
}
/** Diese Methode liest alle Vorgänge aus der Datei "FileDataMain.txt" aus, deren
* Personalnummer die des Anwenders entsprechen.
*/
public static ReportLogData loadReportFromMainFile( ReportModel model, String files , SystemData sys, CheckFiles _File){
...
}
//Das Vehikel ist eine total unabhängige Klasse, die mit einer
//Tabelle eigentlich gar nichts zu tun hat.
class ReportLogData{
private String reportNumber;
private String artOfPatrol;
private String operationOffice;
private String patrolArea;
private String patrolIdentification;
private String licenceNumber;
private String date;
private boolean nightService;
private String patrolTime;
private String patrolAttender;
private String reportStatus;
public ReportLogData(String reportNumber, String employee, String personalNr, String date, String time,
String status, String ip, boolean version, String patrolTime, String patrolAttender, String reportStatus) {
this.reportNumber = reportNumber;
this.artOfPatrol = employee;
this.operationOffice = personalNr;
this.patrolArea = date;
this.patrolIdentification = time;
this.licenceNumber = status;
this.date = ip;
this.nightService = version;
this.patrolTime = patrolTime;
this.reportStatus = reportStatus;
this.patrolAttender = patrolAttender;
}
public String getArtOfPatrol(){ return artOfPatrol; }
public String getOperationOffice(){ return operationOffice; }
public String getPatrolArea(){ return patrolArea; }
public String getPatrolIdentification(){ return patrolIdentification; }
public String getLicenceNumber(){ return licenceNumber; }
public String getDate(){ return date; }
public boolean getNightService(){ return nightService;}
public String getPatrolTime(){return patrolTime;}
public String getReportStatus(){return reportStatus;}
public String getPatrolAttender(){return patrolAttender;}
public String getReportNumber(){return reportNumber;}
}
//Unsere Implementation des TableModels
class ReportModel implements TableModel{
private static Vector reports = new Vector();
private Vector listeners = new Vector();
public void addVehicle( ReportData log ){ // Das wird der Index des Vehikels werden
int index = reports.size();
// letzter Eintrag erscheint zuerst
reports.add(0, log);
// Jetzt werden alle Listeners benachrichtigt
// Zuerst ein Event, "neue Row an der Stelle index" herstellen
TableModelEvent e = new TableModelEvent( this, index, index,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT );
// Nun das Event verschicken
for( int i = 0, n = listeners.size(); i<n; i++ ){
((TableModelListener)listeners.get( i )).tableChanged( e );
}
}
// Die Anzahl Columns
public int getColumnCount() {
return 11;
}
public static Vector getModelVector(){
return reports;
}
// Die Anzahl Vehikel
public int getRowCount() {
return reports.size();
}
// Die Titel der einzelnen Columns
public String getColumnName(int column) {
switch( column ){
case 0: return "Streifenart";
case 1: return "Einsatzdst.";
case 2: return "Streifenbereich";
case 3: return "Streifenbezeichnung";
case 4: return "amtl. Kz.";
case 5: return "Datum";
case 6: return "Nachtdienst";
case 7: return "Streifenzeit";
case 8: return "Besatzung";
case 9: return "Status";
case 10:return " ";
case 11:return " ";
default: return "";
}
}
// Der Wert der Zelle (rowIndex, columnIndex)
public Object getValueAt(int rowIndex, int columnIndex) {
ReportData vehicle = (ReportData)reports.get( rowIndex );
switch( columnIndex ){
case 0: return vehicle.getArtOfPatrol();
case 1: return vehicle.getOperationOffice();
case 2: return vehicle.getPatrolArea();
case 3: return vehicle.getPatrolIdentification();
case 4: return vehicle.getLicenceNumber();
case 5: return vehicle.getDateAsSimpleDateFormat();
case 6: return vehicle.getNightService();
case 7: return vehicle.getPatrolTime();
case 8: return vehicle.getPatrolAttender();
case 9: return vehicle.getReportStatus();
case 10: return vehicle.getReportStatus();
case 11: return vehicle.getReportNumber();
default: return null;
}
}
// Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
public Class getColumnClass(int columnIndex) {
switch( columnIndex ){
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return String.class;
case 4: return String.class;
case 5: return String.class;
case 6: return Boolean.class;
case 7: return String.class;
case 8: return String.class;
case 9: return String.class;
case 10: return Color.class;
case 11: return String.class;
default: return null;
}
}
public void addTableModelListener(TableModelListener l) {
listeners.add( l );
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove( l );
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// nicht beachten
}
public void deleteData(){
reports.removeAllElements();
}
}