# Kalender-App mit tagesübergreifenden Einträgen



## juro (17. Jul 2006)

Hi,
Ich programmiere gerade ein GUI für einen Beachvolleyball Kalender. Die Daten parse ich von einer (sehr unübersichtlichen) Seite. Anbei ist die Struktur des Kalenders (ohne Menubalken, Menu, usw, was eh selbstredend ist). Ist so etwas mit Java überhaupt möglich und wenn ja mittels welchem Layout-Manager (OverlayLayout)?
Das Problem besteht in den überlagerten "Turnierbalken", welche mehrere Tage überlappen können.







Danke für Eure Anregungen.
lg
juro


----------



## Brainiac (17. Jul 2006)

Schau mal nach JLayeredPane die kannst du übereinanderstapeln.

Für die Balken dann halt JLabel. Beim Kalender hängt es davon ab, ob das nur ne Grafik sein soll, oder der auch noch ne Funktion haben soll. Wenn nur Grafik dann ein fach als Bild auf ein JLabel.


----------



## juro (17. Jul 2006)

Ok, danke. JLayeredPane werde ich mir mal anschauen (irgendwo im o'Reilly steht sicher was drin).

Funktional sollen die einzelnen Turniere Buttons sein (anklickbar), die auf eine Detailansicht "verlinken".


----------



## thE_29 (17. Jul 2006)

Mhm..

Ne Tabelle, da fällt mir nur mein gutes altes TableLayout ein


----------



## juro (17. Jul 2006)

*thE_29*, ich glaube nicht, daß man zusammenhängende Zellen im TableLayout definieren kann - vor Allem, weil ja einige Elemente (Tage) pro Zelle einmal vorkommen, und andere (Turniere) zellenübergreifend sind.


----------



## Brainiac (17. Jul 2006)

juro hat gesagt.:
			
		

> Ok, danke. JLayeredPane werde ich mir mal anschauen (irgendwo im o'Reilly steht sicher was drin).
> 
> Funktional sollen die einzelnen Turniere Buttons sein (anklickbar), die auf eine Detailansicht "verlinken".



Dann hängste an die JLabels einfach nen MouseListener drann und schon sind sie anklickbar.


----------



## juro (17. Jul 2006)

*Brainiac*, yup, das war der Plan.


----------



## thE_29 (18. Jul 2006)

@juro: doch kann man. Bzw man kann sagen Label gehe über 1 bis 5te Spalte!


----------



## juro (18. Jul 2006)

*thE_29*, ok, tut mir leid falls ich mich irre. D.h. ich habe in einer Zelle den Tag und dann drüber ein (oder mehrere) Turnier-JLabels...
Very confusing ...


----------



## thE_29 (18. Jul 2006)

Zb!

So könntest du das machen!



```
double sizes2[][] = { { 0.05, 0.4, 0.1,0.4,0.05, TableLayout.FILL } , {0.05, 0.4, 0.1,0.4,0.05}};
    this.setLayout(new TableLayout(sizes2));
    
    JButton b1[] = new JButton[4];
    for(int x = 0; x != b1.length; x++)
    {
      b1[x] = new JButton();
      b1[x].setBorder(BorderFactory.createLineBorder(Color.BLACK));
    }
    
    JLabel f1 = new JLabel("Tournament");
    Panel p1 = new Panel(new TableLayout(new double[][]{{TableLayout.FILL},{TableLayout.FILL}}));
    p1.add(f1, "0,0,0,0,c,c");
    p1.setBackground(Color.RED);
    this.getContentPane().add(p1, "1,1,3,1,f,c");

    this.getContentPane().add(b1[0], "1,1,1,1,f,f");
    this.getContentPane().add(b1[1], "3,1,3,1,f,f");
    this.getContentPane().add(b1[2], "1,3,1,3,f,f");
    this.getContentPane().add(b1[3], "3,3,3,3,f,f");
    

    this.setSize(300,300);
    this.setVisible(true);
```


Hier muss man ein Panel nehmen, sodaß es ÜBER den Buttons bleibt 

Da man in Java noch immer net sagen kann, was als TOP Ding behandelt werden soll und was weiter hinten (ist irgendwie schade das es sowas net gibt..)

Screenshot: http://666kb.com/i/afvry4ozpg56ocmdu.jpg


----------



## thE_29 (18. Jul 2006)

Update Post


----------



## juro (18. Jul 2006)

Herzlichen Dank für die Arbeit, ich werde mir das mal heute am Abend anschauen - leider muss ich momentan arbeiten (testcases erstellen und durchführen *würg*).


----------



## juro (25. Jul 2006)

Hmm, irgendwie schau ich da noch nicht ganz durch. Könntest Du mir bitte den kompletten source code schicken?


----------



## Roar (25. Jul 2006)

hm, TableLayout ist für sowas doch schon die falsche Wahl. Da du das dynamisch zusammenbauen willst, bist du mit ner JLayeredPane/OverlayLayout oder es ganz manuell machen besser bedient.



> Da man in Java noch immer net sagen kann, was als TOP Ding behandelt werden soll und was weiter hinten (ist irgendwie schade das es sowas net gibt..)


setComponentZOrder(Component, int)


----------



## juro (25. Jul 2006)

Den Einwand verstehe ich (so wie anscheinend einiges) nicht ganz.


----------



## Roar (26. Jul 2006)

du willst doch deine daten von einer website auslesen, das heißt du darfst die layout constraints bei jeder änderung neu berechnung und erstellen, und die komponenten alle neu hinzufügen. wenn du ne JLayeredPane benutzt, musst du nur ausrechnen wo der Balken hin soll und ihn dann hizufügen.


----------



## thE_29 (26. Jul 2006)

Bitte ab wann gibts diese setComponentZOrder?!

Und TableLayout kann man auch dynamisch machen, man muss halt nur die sizes vorher berechnen..


----------



## juro (26. Jul 2006)

Interessant finde ich auch, daß in der HTML-Welt Layouten per Tabelle mittlerweile verpöhnt ist und hier wird es erst recht wieder so gemacht


----------



## thE_29 (26. Jul 2006)

Wayne interessiert HTML


----------



## Illuvatar (26. Jul 2006)

thE_29 hat gesagt.:
			
		

> Bitte ab wann gibts diese setComponentZOrder?!



Hust hust [schild=12 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]API gucken [/schild]

Seit 1.5


----------



## thE_29 (26. Jul 2006)

Tjo, warum ist sowas net bitte mit Swing eingeführt worden...


1.5 wird wirklich Zeit...

Muss das mal den Kunden vorschlagen


----------



## juro (26. Jul 2006)

Irgendwie habe ich nicht rausfinden können, wie ich die Turniere untereinander anordnen kann. Mittlerweile habe ich das so weit: http://www.juro.at/beachGUI.png


----------



## thE_29 (26. Jul 2006)

Wie hast du den das jetzt gemacht?


hast du eine gewisse max. Anzahl der darüberlegenden Turniere oder sollen es unendlich sein können?!

Desweiteren, kannst du mit java 1.5 ja mit dem setComponentZOrder arbeiten und brauchst net auf das Panel zurückgreifen!


----------



## juro (26. Jul 2006)

```
public JPanel createDays(GregorianCalendar thisMonth) {
        int _thisDay 		= thisMonth.get(GregorianCalendar.DAY_OF_MONTH);
        int _noOfDays 		= thisMonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
        int _dayNoInWeek 	= thisMonth.get(GregorianCalendar.DAY_OF_WEEK);
        int _dayOffset		= _dayNoInWeek - 2;
        int _xPos			= 0;
        int _xStartPos		= 0;
        int _yPos			= 0;
        int _yStartPos		= 4;
        String _cellPos		= "";
        
    	Border _loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
    	
    	int _header		= 20;
    	int _rows		= 150;
    	int _columns	= 150;
    	int _spacing	= 10;
    	
    	double _size[][] = {{_columns, _spacing, _columns, _spacing, _columns, _spacing, _columns, _spacing, _columns, _spacing, _columns, _spacing, _columns}, 
    						{_header, _spacing, _header, _spacing, _rows, _spacing, _rows, _spacing, _rows, _spacing, _rows, _spacing, _rows}}; 
    	
    	JPanel _daysPanel = new JPanel();		// 	creates container for all days
        _daysPanel.setLayout(new TableLayout(_size));
        
        //	create month name
        JLabel _monthName = new JLabel(MONTHNAMES[thisMonth.get(GregorianCalendar.MONTH)]);
        _daysPanel.add(_monthName, "0,0,12,0,c,c");
        
        //	create day labels
        for (int i = 0; i < DAYNAMES.length; i++) {
        	_xPos = i*2;
        	_cellPos = _xPos + ",3,c,t";
        	JLabel _dayName = new JLabel(DAYNAMES[i]);
        	if (i == _thisDay) {
        		_dayName.setBackground(Color.magenta);
        	}
        	_daysPanel.add(_dayName, _cellPos);
        }
        
        for (int i = 0; i < _noOfDays; i++) {
        	//	only add to even columns and rows
        	_yPos = ((i + _dayOffset)/7)*2 + _yStartPos;				//	define y position in Layout
        	_xPos = (i + _dayOffset)*2 - 7*(_yPos-_yStartPos) + _xStartPos;			//	define x position in Layout
        	
        	//	combine the positions to a String
        	_cellPos = _xPos + "," + _yPos + ",f,f";
        	
    		JPanel day = new JPanel();
    		day.setName("day" + i);								// 	define name of JPanel: day + number of day, i.e. day1 
    		day.setBorder(_loweredetched);						//	set border
    		
    		TitledBorder tBorder = BorderFactory.createTitledBorder("" + (i+1));
    		tBorder.setTitleJustification(TitledBorder.CENTER);
    		tBorder.setTitlePosition(TitledBorder.DEFAULT_POSITION);
    		day.setBorder(tBorder);
    		//day.setPreferredSize(new Dimension(150, 150));
    		
    		_daysPanel.add(day, _cellPos);
    	}
        
//    	now add the tournament for this month
        HashMap _tourForMonth = calender.getTourByMonth(thisMonth);
        Set _tourMap = _tourForMonth.entrySet();
        Iterator _tourIter = _tourMap.iterator();
        
        if (_tourForMonth.size() > 0) {
        	while (_tourIter.hasNext()) {
        		// @TODO: layout tournaments under NOT over each other 
        		Map.Entry _tourEntry = (Map.Entry)_tourIter.next();
        		Tournament _tour = (Tournament)_tourEntry.getValue();
        		JTournament _tourJLabel = new JTournament(_tour);
        		int [] _dates = _tourJLabel.getStartEnd();
        		//	get x and y pos of first cell
        		_yPos = (((_dates[0]-1) + _dayOffset)/7)*2 + _yStartPos;
        		_xPos = ((_dates[0]-1) + _dayOffset)*2 - 7*(_yPos-_yStartPos) + _xStartPos;
        		_cellPos = _xPos + "," + _yPos;
        		//	get x and y pos of last cell
        		_yPos = (((_dates[1]-1) + _dayOffset)/7)*2 + _yStartPos;
        		_xPos = ((_dates[1]-1) + _dayOffset)*2 - 7*(_yPos-_yStartPos) + _xStartPos;
        		_cellPos += "," + _xPos + "," + _yPos + ",f,t";
        		// System.out.println(_tour.getId() + ": " + _dates[0] + " - " + _dates[1] + " .... _cellPos = " + _cellPos);
        		_daysPanel.add(_tourJLabel, _cellPos);
        		_daysPanel.setComponentZOrder(_tourJLabel, 3);
        	}
        } else {
        	System.out.println("No tournaments for month " + thisMonth.get(GregorianCalendar.MONTH));
        }
        
        this.daysPanel = _daysPanel;
        return _daysPanel;
    }
```


----------



## thE_29 (27. Jul 2006)

Es wäre sinnvoll dein Bsp so hinzubiegen das ich das auch ausführen kann oder du postet alles was man braucht!


----------



## juro (27. Jul 2006)

Ok, hier kannst Du Dir das komplette Eclips Projekt runterladen. Aber Vorsicht! Es ist meine erste GUI-Applikation, daher ein bisschen konfus ...

http://www.juro.at/bvb-info.zip


----------

