Multiple Zeilen in einer JTable Zelle

Status
Nicht offen für weitere Antworten.

Audio Anarchy

Aktives Mitglied
Hallo Freunde,

ich habe eine Tabelle mit 2 Spalten.

Die erste Spalte zeigt volle Stunden an. Das JLabel wird zentriert angezeigt.
Die zweite Spalte soll jede viertel Stunde anzeigen und wird rot markiert. Also auf eine Zeile in der ersten
Spalte kommen vier Zeilen in der Zweiten Spalte.

Ich habe die Tabelle bisher an meine Bedürfnisse angepasst und den prepareRenderer überschrieben.
Das sieht so aus:

Code:
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

        JLabel c = (JLabel) super.prepareRenderer(renderer, row, column);
        if (column == 0){
            c.setHorizontalAlignment(JLabel.CENTER);
        }else{
            c.setHorizontalAlignment(JLabel.LEFT);
        }

        if (column == 1){
            c.setBackground(Color.RED);
        }

        return c;
    }

Gibt es für mich eine Möglichkeit in der obigen Methode zu sagen dass er mir die Zellen in der zweiten Spalte
in vier Zeilen unterteilen soll, auf die ich dann einzeln zugreifen kann. Danke für's Lesen!
 
Nur mit dem Überschreiben von prepareRenderer wird man da vermutlich nicht weit kommen. Ich würde da einen eigenen CellRenderer für die zweite Spalte erstellen. Könnte allerdings ziemlich aufwendig werden.
 
wäre es so schlimm, wenn z.B. die erste Spalte ebenfalls die vier Zellen hätte und nur eine befüllt bzw. nur ein Eintrag sichtbar
 
wenn's um einen Terminplaner geht, habe ich da noch was altes von mir ein bisschen modifiziert.
Vielleicht kannst Du darauf aufbauen. Mit z.B. JScrollPane.setRowHeaderView() (s. Zeile 15) kann man beliebige Komponten als Zeilenbeschriftung setzen. Vielleicht kannst Du Dir dann die vierer Unterteilung einzelner Zellen sparen.
Code:
import java.awt.*;

import javax.swing.*;
import javax.swing.table.*;

public class TimeTableDemo extends JFrame {
	private TimeTable table;
	
	public TimeTableDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(50, 50, 500, 300);
		
		table = new TimeTable(new DefaultTableModel(new Object [24][], new String [] {"Mo", "Di", "Mi", "Do", "Fr"}));
		JScrollPane pane = new JScrollPane(table);
		pane.setRowHeaderView(new TimeHeader(table.getRowHeight()*4, new Object[] {"08", "09", "10", "11", "12", "13"}));
		
		this.getContentPane().add(pane, BorderLayout.CENTER);
		
		for (int r=3; r<10; r++)
			table.setValueAt(new Object(), r, 1);
		
		for (int r=5; r<19; r++)
			table.setValueAt(new Object(), r, 3);
		
	}
	
	public static void main(String[] args) {
		new TimeTableDemo().setVisible(true);
	}
}

class TimeTable extends JTable {
	
	public TimeTable(TableModel model) {
		super(model);
		setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		setRowSelectionAllowed(false);
		setColumnSelectionAllowed(false);
		setCellSelectionEnabled(true);
		setDefaultRenderer(Object.class, new TimeCellRenderer());
	}
	
	public boolean isCellEditable(int row, int column) {
		return false;
	}
}

class TimeCellRenderer implements TableCellRenderer {
	private JLabel label = new JLabel();
	
	public TimeCellRenderer() {
		this.label = new JLabel();
		this.label.setOpaque(true);
	}
	
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		if (value!=null) {
			this.label.setBackground(Color.CYAN);
		}
		else if (isSelected) {
			this.label.setBackground(table.getSelectionBackground());
		}
		else
			this.label.setBackground(Color.WHITE);
		return this.label;
	}
	
}

class TimeHeader extends JComponent {
	private int rowHeight;
	private Object[] object;
	private int objectCount;
	
	public TimeHeader(int height, Object[] object) {
		this.rowHeight = height;
		this.object = object;
		this.objectCount = object.length;
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		int w = this.getWidth();
		int w2 = w/2;
		int h =  this.rowHeight;
		int h1 = h/4 -1;
		int h2 = h*2/4 -1;
		int h3 = h*3/4 -1;
		
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, w, this.getHeight());
		
		g.setColor(Color.BLACK);
		g.drawLine(w-1, 0, w-1, this.getHeight());
		g.drawLine(0, 0, w, 0);
		for (int i=0; i<this.objectCount; i++) {
			g.drawLine(w2, i*h +h1, w, i*h +h1);
			g.drawLine(w2, i*h +h2, w, i*h +h2);
			g.drawLine(w2, i*h +h3, w, i*h +h3);
			g.drawLine(0, i*h +h-1, w, i*h +h-1);
			g.drawString(object[i].toString(), 2, i*h +12);
		}
	}
	
	public Dimension getPreferredSize() {
		return new Dimension(30, 3000);
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben