Kalender-App mit tagesübergreifenden Einträgen

Status
Nicht offen für weitere Antworten.

juro

Mitglied
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.

calendar.png


Danke für Eure Anregungen.
lg
juro
 

Brainiac

Bekanntes Mitglied
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

Mitglied
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".
 

juro

Mitglied
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

Bekanntes Mitglied
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

Mitglied
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

Top Contributor
Zb!

So könntest du das machen!


Code:
    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
 

juro

Mitglied
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

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

Roar

Gast
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)
 
R

Roar

Gast
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

Top Contributor
Bitte ab wann gibts diese setComponentZOrder?!

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

juro

Mitglied
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

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


1.5 wird wirklich Zeit...

Muss das mal den Kunden vorschlagen ;)
 

thE_29

Top Contributor
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

Mitglied
Code:
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

Top Contributor
Es wäre sinnvoll dein Bsp so hinzubiegen das ich das auch ausführen kann oder du postet alles was man braucht!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JavaFX Kalender AWT, Swing, JavaFX & SWT 0
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
K Stundenplan, Kalender Methoden AWT, Swing, JavaFX & SWT 2
B Java Kalender AWT, Swing, JavaFX & SWT 10
M Kalender mit Mohnatsansicht AWT, Swing, JavaFX & SWT 2
J Swing Kalender soll auf Buttondruck einen Monat weiterblättern AWT, Swing, JavaFX & SWT 7
B Kalender per JTable AWT, Swing, JavaFX & SWT 26
P SWT Übersicht a la Outlook Kalender AWT, Swing, JavaFX & SWT 3
E Kalender mit der Möglichkeit mehrere Tage zu selectieren AWT, Swing, JavaFX & SWT 3
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
A Bei Eingabe eines Datums ein Kalender aufpoppen lassen AWT, Swing, JavaFX & SWT 2
G Kalender aufpoppen lassen AWT, Swing, JavaFX & SWT 6
S Kalender aktualisieren AWT, Swing, JavaFX & SWT 3
X Kalender einbauen AWT, Swing, JavaFX & SWT 8
M [Swing] Kalender mit JTable / Einfärben von Zellen AWT, Swing, JavaFX & SWT 10
R Termin Kalender Bibliothek gesucht AWT, Swing, JavaFX & SWT 4
K Kalender GUI AWT, Swing, JavaFX & SWT 2
L Ein Kalender in Swing ? Vorgefertigter Dialog ? AWT, Swing, JavaFX & SWT 3
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
S Swing Checkboxen in Einträgen des Typs DefaultMutableTreeNode AWT, Swing, JavaFX & SWT 23
G JList mit einer großen Anzahl an Einträgen AWT, Swing, JavaFX & SWT 15
S Swing editable JCombobox mit eigenen Einträgen manangen AWT, Swing, JavaFX & SWT 5
H Swing NullPointerException in JTable bei vielen Einträgen AWT, Swing, JavaFX & SWT 2
H2SO3- choice mit mehrfarbigen einträgen AWT, Swing, JavaFX & SWT 4
PAX JList aktualisiert zu langsam beim Hinzufügen von Einträgen AWT, Swing, JavaFX & SWT 6
R SWT: Icons im Table vor den Einträgen AWT, Swing, JavaFX & SWT 3
A Ideen für eine Filterfunktion von JTable-Einträgen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben