Hallo,
zurzeit arbeite ich an einer Übungsaufgabe in der ich einen Kalender visuell darstellen soll.
Bei dem ganzen handelt es sich um eine Erweiterung eines Programms, welches die Anzahl der Arbeitstage zwischen zwei vom Anwender angegebenen Daten ausrechnet.
Dementsprechend sollen unter anderem auch die untersuchten Zeiträume in dem Kalender farblich markiert werden.
Um dies umzusetzen habe ich mich für den Einsatz einer JTable entschieden und dessen TableCellRenderer überschrieben.
Das funktioniert eigentlich soweit auch alles ganz gut, nur habe ich nun das Problem das sobald eine anderes Fenster über den Kalender gezogen wird Grafikfehler entstehen.
Das scheint wohl mit an meinem Renderer zu liegen, da ich bei der Implementierung davon ausgegangen bin das die JTable wenn, immer komplett neu gezeichnet wird und auch nicht wusste das sie überhaupt neu gezeichnet werden muss, sobald eine andere Komponente darüber gelegt wurde.
Dementsprechend wollte ich mal nachfragen ob es vielleicht eine Möglichkeit gibt die JTabel dazu zu zwingen immer alle Zellen zu rendern anstatt nur den partiellen Bereich der durch bspw. einer ComboBox verdeckt wurde oder ihr vielleicht eine andere Idee habt wie ich mein Problem lösen kann.
Hier nochmal der Code meines Renderers:
Vielen Dank schionmal im vorraus,
Demli
zurzeit arbeite ich an einer Übungsaufgabe in der ich einen Kalender visuell darstellen soll.
Bei dem ganzen handelt es sich um eine Erweiterung eines Programms, welches die Anzahl der Arbeitstage zwischen zwei vom Anwender angegebenen Daten ausrechnet.
Dementsprechend sollen unter anderem auch die untersuchten Zeiträume in dem Kalender farblich markiert werden.
Um dies umzusetzen habe ich mich für den Einsatz einer JTable entschieden und dessen TableCellRenderer überschrieben.
Das funktioniert eigentlich soweit auch alles ganz gut, nur habe ich nun das Problem das sobald eine anderes Fenster über den Kalender gezogen wird Grafikfehler entstehen.
Das scheint wohl mit an meinem Renderer zu liegen, da ich bei der Implementierung davon ausgegangen bin das die JTable wenn, immer komplett neu gezeichnet wird und auch nicht wusste das sie überhaupt neu gezeichnet werden muss, sobald eine andere Komponente darüber gelegt wurde.
Dementsprechend wollte ich mal nachfragen ob es vielleicht eine Möglichkeit gibt die JTabel dazu zu zwingen immer alle Zellen zu rendern anstatt nur den partiellen Bereich der durch bspw. einer ComboBox verdeckt wurde oder ihr vielleicht eine andere Idee habt wie ich mein Problem lösen kann.
Hier nochmal der Code meines Renderers:
Java:
Kalender.setDefaultRenderer(Object.class,new DefaultTableCellRenderer(){
public void setValue(Object value)
{
/*
* selmonat wird in einigen Faellen nicht richtig zurückgesetzt,
* deswegen wird am Anfang der Methode ueberprueft ob value den
* Wert "Januar" besitzt und eigentlich '0' sein sollte.
*/
if(value!=null)
{
if(value.equals("Januar"))
{
selmonat = 0;
}
}
/*
* Beim Einfuegen der Werte in die Tabelle wird ueberprueft ob die
* aktuell beschreibene Zelle ein Wochendtag anzeigt. Falls ja, wird
* sie je nach Wochenendtag grau oder hellgrau gekennzeichnet, falls
* nicht bleibt die Zelle uneditiert.
*/
if (value instanceof Integer)
{
setHorizontalAlignment(JLabel.LEFT);
int anft = 0, anfm = 0, endt = 0, endm = 0;
GregorianCalendar cal = new GregorianCalendar();
cal.set(GregorianCalendar.YEAR,seljahr);
cal.set(GregorianCalendar.MONTH,selmonat);
cal.set(GregorianCalendar.DAY_OF_MONTH,Integer.valueOf(value.toString()));
if(ergebnisse.getItemCount()!=0)
{
/*
* Falls das das Anfangsjahr nicht groeßer als das ausgewaehlte
* Jahr ist oder das Endjahr nicht kleiner als das ausgewaehlte
* Jahr ist.
*/
if((jah.get(ergebnisse.getSelectedIndex())>Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString())||jah2.get(ergebnisse.getSelectedIndex())<Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString()))!=true)
{
anft = tag.get(ergebnisse.getSelectedIndex());
anfm = mon.get(ergebnisse.getSelectedIndex())-1;
endt = tag2.get(ergebnisse.getSelectedIndex());
endm = mon2.get(ergebnisse.getSelectedIndex())-1;
if((jah.get(ergebnisse.getSelectedIndex())==Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString()))!=true&&(jah2.get(ergebnisse.getSelectedIndex())==Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString()))!=true)
{
if(jah.get(ergebnisse.getSelectedIndex())<Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString()))
{
anft = 1;
anfm = 0;
}
if(jah2.get(ergebnisse.getSelectedIndex())>Integer.valueOf(jahr.getItemAt(jahr.getSelectedIndex()).toString()))
{
endt = 31;
endm = 11;
}
}
}
}
if(ergebnisse.getItemCount()!=0 && cal.get(GregorianCalendar.MONTH)>=anfm &&
cal.get(GregorianCalendar.MONTH)<=endm)
{
if(cal.get(GregorianCalendar.MONTH)==anfm && cal.get(GregorianCalendar.DAY_OF_MONTH)<anft)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7 || cal.get(GregorianCalendar.DAY_OF_WEEK) == 1)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7)
{
setForeground(Color.WHITE);
setBackground(Color.LIGHT_GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.LIGHT_GRAY;
}
else
{
setForeground(Color.WHITE);
setBackground(Color.GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.GRAY;
}
}
else
{
setForeground(Color.BLACK);
setBackground(Color.WHITE);
super.setValue(" "+value);
col[selmonat][Integer.valueOf(value.toString())-1] = Color.WHITE;
}
}
else
{
if(cal.get(GregorianCalendar.MONTH)==endm && cal.get(GregorianCalendar.DAY_OF_MONTH)>endt)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7 || cal.get(GregorianCalendar.DAY_OF_WEEK) == 1)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7)
{
setForeground(Color.WHITE);
setBackground(Color.LIGHT_GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.LIGHT_GRAY;
}
else
{
setForeground(Color.WHITE);
setBackground(Color.GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.GRAY;
}
}
else
{
setForeground(Color.BLACK);
setBackground(Color.WHITE);
super.setValue(" "+value);
col[selmonat][Integer.valueOf(value.toString())-1] = Color.WHITE;
}
}
else
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7 || cal.get(GregorianCalendar.DAY_OF_WEEK) == 1)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7)
{
setForeground(Color.WHITE);
setBackground(Color.YELLOW.darker());
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.YELLOW.darker();
}
else
{
setForeground(Color.WHITE);
setBackground(Color.YELLOW.darker().darker());
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.YELLOW.darker().darker();
}
}
else
{
setForeground(Color.BLACK);
setBackground(Color.YELLOW.brighter());
super.setValue(" "+value);
col[selmonat][Integer.valueOf(value.toString())-1] = Color.YELLOW.brighter();
}
}
}
}
else
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7 || cal.get(GregorianCalendar.DAY_OF_WEEK) == 1)
{
if(cal.get(GregorianCalendar.DAY_OF_WEEK) == 7)
{
setForeground(Color.WHITE);
setBackground(Color.LIGHT_GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.LIGHT_GRAY;
}
else
{
setForeground(Color.WHITE);
setBackground(Color.GRAY);
setText(" "+value.toString());
col[selmonat][Integer.valueOf(value.toString())-1] = Color.GRAY;
}
}
else
{
setForeground(Color.BLACK);
setBackground(Color.WHITE);
super.setValue(" "+value);
col[selmonat][Integer.valueOf(value.toString())-1] = Color.WHITE;
}
}
}
else
{
if(value instanceof String)
{
setHorizontalAlignment(JLabel.CENTER);
setBorder(BorderFactory.createMatteBorder(0,0,1,0,Color.BLACK));
setForeground(Color.BLACK);
setBackground(Color.WHITE);
super.setValue("<html><b>"+value+"</b></html>");
}
else
{
setForeground(Color.BLACK);
setBackground(Color.WHITE);
super.setValue(value);
}
}
if(selmonat != 11)
{
selmonat++;
}
else
{
selmonat=0;
}
}
});
Vielen Dank schionmal im vorraus,
Demli