private void initPrintFrame(final boolean selectedDataTableObjectsOnly) {
		// den Spezial-Konstruktor aufrufen:

		if(_archive) {
			_printFrame = new ArchiveDataTableView(_connection, _attributeGroup, _aspect, _dataDescription.getSimulationVariant());
		}
		else {
			_printFrame = new DataViewFrame(
					_connection, _attributeGroup, _aspect, _dataDescription.getSimulationVariant()
			);
		}

		// leere Menue-Leiste hinzufügen:
		createDummyMenuBar();
		// kopiere die Breiten aller Spalten und ihren offen/geschlossen-Status:
		final HeaderGrid printFrameHeaderGrid = _printFrame.getDataViewPanel().getHeaderGrid();
		final HeaderGrid originalHeaderGrid = _dataViewPanel.getHeaderGrid();
		printFrameHeaderGrid.makeSimilar(originalHeaderGrid);
		printFrameHeaderGrid.removeAllMouseListeners();
		// bestimme die relevanten DataTableObjects:
		if(selectedDataTableObjectsOnly) {
			final SelectionManager selectionManager = _dataViewPanel.getSelectionManager();
			final List<DataTableObject> thisDataTableObjects = Collections.synchronizedList(_dataViewModel.getDataTableObjects());
			synchronized(thisDataTableObjects) {
				final int size = thisDataTableObjects.size();
				for(int index = 0; index < size; index++) {
					final List<CellKey> cellKeyList = thisDataTableObjects.get(index).getAllCellKeys();
					for(CellKey cellKey : cellKeyList) {
						if(selectionManager.isCellKeySelected(cellKey)) {
							final int finalIndex = index;
							SwingUtilities.invokeLater(
									new Runnable() {
										public void run() {
											_printFrame.getDataViewPanel().addDataTableObject(finalIndex, thisDataTableObjects.get(finalIndex));
										}
									}
							);
							break;
						}
					}
				}
			}
		}
		else {
			final List<DataTableObject> thisDataTableObjects = _dataViewModel.getDataTableObjects();
			synchronized(thisDataTableObjects) {
				final int size = thisDataTableObjects.size();
				for(int index = 0; index < size; index++) {
					final int finalIndex = index;
					SwingUtilities.invokeLater(
							new Runnable() {
								public void run() {
									_printFrame.getDataViewPanel().addDataTableObject(finalIndex, thisDataTableObjects.get(finalIndex));
								}
							}
					);
				}
			}
		}
		// Präpariere den SelectionManager:
		final SelectionManager selectionManager = _printFrame.getDataViewPanel().getSelectionManager();
		if(_highlightSelectionButton.isSelected()) {
			selectionManager.setSelectedCellKeys(_dataViewPanel.getSelectionManager().getSelectedCellKeysAsSet());
			selectionManager.setSelectedRowKeys(_dataViewPanel.getSelectionManager().getSelectedRowKeysAsSet());
		}
		selectionManager.lock(true);

		_printFrame.getFrame().setTitle("Druckvorschau");
		_printFrame.getFrame().setBounds(_frame.getBounds());
		if(!_printPreviewInVisibleRegion.isSelected()) {
			_printFrame.getFrame().setLocation(10000, 10000);
		}
		// Das Layout wurde in dem privaten Konstruktor schon gesetzt, aber das Panel muss noch dazu:
		final Container pane = _printFrame.getFrame().getContentPane();
		pane.add(_printFrame.getDataViewPanel(), BorderLayout.CENTER);

		// Ein generelles JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED hätte wohl den Nachteil, dass bei
		// sich ändernden Spaltenbreiten der Zeilenköpfe, mal eine ScrollBar da sein könnte wäre und mal nicht,
		// was entweder zu verdecktem oder doppelten Darstellungen führen würde, je nachdem ob die Seiten des
		// Books mit oder ohne Scrollbar berechent wurden.
		if(_dataViewPanel.isHorizontalScrollBarVisible()) {
			_printFrame.getDataViewPanel().setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		}
		else {
			_printFrame.getDataViewPanel().setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		}
		_printFrame.getFrame().validate();
	}