Tabelle laden - Prozessorlast 100% ??

Oli

Top Contributor
Hallo, ich habe folgende Table. Wenn ich diese initialisiere, dann geht meine Prozessorauslastung auf 100 %.

Ich hab keine Idee, woran das liegen kann. Hat jemand einen Tipp für mich?

Danke Oli

Java:
public class TablePruefParameterAuswahl extends JTable {

	private static final long serialVersionUID = 1L;

	public int colsLength = 0;
	public Object[] cols;

	public TablePruefParameterAuswahl(Object[][] rows, Object[] cols) {
		super(rows, cols);
		this.cols = cols;
		colsLength = cols.length;
		setModel(getTableModel(rows, cols));
		getTableHeader().setReorderingAllowed(false);
		setFont(new Font("Arial", Font.PLAIN, 14));
		setRowHeight(25);
		setGridColor(Color.black);
		getTableHeader().setBorder(BorderFactory.createLineBorder(Color.black));
		setBorder(BorderFactory.createLineBorder(Color.black));
		setBackground(Color.white);
		getTableHeader().setDefaultRenderer(new MyHeaderRenderer());
		UIManager.put("Table.focusCellHighlightBorder", new LineBorder(new Color(0x483d8b), 2));
		SwingUtilities.updateComponentTreeUI(this);
		setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		
		for (int i = 0; i < getColumnCount(); i++) {
			while (!packColumn(this, i, 15))
				;
		}
	}

	@Override
	public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
		Component c = super.prepareRenderer(renderer, row, column);

		if (c instanceof JLabel) {

			JLabel label = (JLabel) c;
			label.setHorizontalAlignment(JLabel.LEFT);
			setFont(new Font("Arial", Font.BOLD, 14));
			label.setText(" " + label.getText());
			if (column == 0) {
				label.setBackground(new Color(0x708090));
				label.setForeground(Color.white);
			}
			else if (column % 2 == 0) {
				label.setBackground(new Color(0xf5deb4));
				label.setForeground(Color.black);
			}
			else {
				label.setBackground(new Color(0xd8bfd8));
				label.setForeground(Color.black);

			}
		}
		return c;
	}

	public DefaultTableModel getTableModel(Object[][] rows, Object[] cols) {
		return new DefaultTableModel(rows, cols) {
			private static final long serialVersionUID = 1L;

			public boolean isCellEditable(int i, int j) {
				if (j == 2)
					return true;
				else
					return false;
			}

			public Class<?> getColumnClass(int columnIndex) {
				if (columnIndex == 0)
					return PruefParameter.class;
				if (columnIndex == 2)
					return Boolean.class;
				else
					return String.class;
			}
		};
	}

	class MyHeaderRenderer extends JButton implements TableCellRenderer {

		private static final long serialVersionUID = 1L;
		int pushedColumn;

		public MyHeaderRenderer() {
			super();
			setOpaque(true);
			setForeground(UIManager.getColor("TableHeader.foreground"));
			setBackground(UIManager.getColor("TableHeader.background"));
			setBorder(BorderFactory.createLineBorder(Color.black));
			setToolTipText("Zum Wählen der Durchmesser und Farbcodes hier klicken.");
			setBorder(null);
			pushedColumn = -1;
			setMargin(new Insets(0, 0, 0, 0));
		}

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
			setText((value == null) ? "" : value.toString());
			setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.black));
			if (column == 0)
//				setPreferredSize(new Dimension(200, 25));
			if (column == 1)
//				setPreferredSize(new Dimension(200, 25));
			if (column == 2)
//				setPreferredSize(new Dimension(50, 25));

			setFont(new Font("Arial", Font.BOLD, 14));
			setText(" " + getText());
			repaint();
			return this;
		}

		public void setPressedColumn(int col) {
			pushedColumn = col;
		}
	}


	public boolean packColumn(JTable table, int vColIndex, int margin) {
		DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel();
		TableColumn col = colModel.getColumn(vColIndex);
		int width = 0;

		TableCellRenderer renderer = (MyHeaderRenderer) col.getHeaderRenderer();

		if (renderer == null) {
			renderer = table.getTableHeader().getDefaultRenderer();
		}

		Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);
		width = comp.getPreferredSize().width;

		for (int r = 0; r < table.getRowCount(); r++) {
			renderer = table.getCellRenderer(r, vColIndex);
			comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false, r, vColIndex);
			width = Math.max(width, comp.getPreferredSize().width);
		}
		width += 2 * margin;
		if (width > 1000) {
			return false;
		}
		col.setPreferredWidth(width);
		return true;
	}
}
 
Bin mir nicht 100% sicher ob das ursache ist, aber nimm mal das [c]repaint();[/c] aus [c]getTableCellRendererComponent[/c] raus.
 
Hallo,

hab ich auch schon probiert. Auch kein Erfolg. Ich glaube ich schmeiß die Klasse auf den Müll und schreib sie neu...

Oder hat noch jemand ne Idee??


Grüße Oli
 
Hallo,

ich habe die Lösung: setFont in prepareRenderer auf label.setFont setzen.

Aber kann mir dieses Verhalten bitte jemand erklären???


Danke Oli
 
Ich kann dir nicht erklären worans lag, vorallem weil es daran nicht liegen KANN:
Ein Blick in die Impl. von setFont beim JTable 😀

Java:
 336:       /**
 337:        * Sets the font of the cell. Since table cells cannot have
 338:        * individual fonts, this method does nothing. Set the
 339:        * font directly on the table instead.
 340:        * 
 341:        * @param font not used
 342:        */
 343:       public void setFont(Font font)
 344:       {
 345:         // This method does nothing. See API comments.
 346:       }

Da wird einfach eiskalt... nichts gemacht....

Schwer vorstellbar, dass es dort ne Endlosschleife gibt 😉
 
Hi,

naja eben das dachte ich ja auch. Aber es ist so. setFont in prepareRenderer aufgerufen 100% Last, label.setFont aufgerugen - alles in Ordnung.

Nun, keine Ahnung, aber jetzt klappt´s ja.


Grüße Oli
 
Ich kann dir nicht erklären worans lag, vorallem weil es daran nicht liegen KANN:
Ein Blick in die Impl. von setFont beim JTable 😀

Da wird einfach eiskalt... nichts gemacht....

Schwer vorstellbar, dass es dort ne Endlosschleife gibt 😉

Hast Du ein anderes [c]JTable[/c] als ich? Bei mir hat [c]JTable[/c] diese Methode nicht, sondern erbt sie von [c]JComponent[/c] und dort ist sie sehr wohl definiert.
 
Hallo,

klar ist die definiert. Aber wieso habe ich Prozessor Volllast, wenn ich das in prepareRenderer setze?
Ich mein, abgesehen davon, dass das ein Copy And Paste - Fehler war. Es reicht ja wenn ich die Schrift im Konstruktor setze. Der Grund würde mich aber dennoch interessieren.

Also wo sind die Gurus??

Grüße Oli
 

Neue Themen


Zurück
Oben