# Access restriction



## jf (9. Feb 2012)

Hallo, ich habe gerade aus meinem Projekt die recht allgemeinen Klassen herausgeholt und in ein Projekt _Common_ verschoben. Damit kann ich recht einfach diese Klassen auch in anderen Projekten einsetzen, indem ich eifach das Common-Projekt dem Classpath hinzufüge.

Dabei bin ich leider auf eine Problem gestoßen, welches ich nicht verstehe:

An der Zeile 
	
	
	
	





```
import sun.swing.DefaultLookup;
```
 wird folgender Fehler angezeigt:
_Access restriction: The type DefaultLookup is not accessible due to restriction on required library C:\Program Files (x86)\Java\lib\rt.jar_

Das Problem konnte ich beheben, indem ich als JRE System Library statt 
	
	
	
	





```
JavaSE-1.6
```
 das 
	
	
	
	





```
jdk1.6.0_23
```
 auswählte.
Was ist der Hintergrund hierfür?


----------



## madlion (9. Feb 2012)

Das ist jetzt nur eine Vermutung aber es könnte sein wenn du JavaSE-1.6 benutzt daß Eclipse prüft daß du nur Klassen aus der öffentlichen API verwendet werden. Und wenn mich nicht ganz irre gehört das Package sun.swing.* nicht zur öffentlichen API.


----------



## jf (9. Feb 2012)

Ok. Aber was bedeutet hier öffentlich?
- Heißt das, dass meine Anwendung ein SDK voraussetzt - und nicht läuft, wenn nur eine JRE installiert ist?


----------



## faetzminator (9. Feb 2012)

Das heisst, dass deine Anwendung nur auf JVM's von Sun bzw. nun Oracle läuft. Man sollte also bei Software, die man verbreiten will, niemals Packages wie [c]com.sun[/c], [c]com.ibm[/c] etc. verwenden.
Was macht diese interne Klasse? Gibts da nichts in [c]javax.swing[/c], was das gleiche kann?


----------



## madlion (9. Feb 2012)

jf hat gesagt.:


> Ok. Aber was bedeutet hier öffentlich?


Öffentlich heißt daß du alles verwenden kannst was in der Java API Doc beschrieben ist. D.h. grob gesagt alles was mit java.* oder javax.* beginnt (die org.omg.*, org.w3c.* und org.xml.* habe ich jetzt mal außenvor gelassen).


----------



## jf (10. Feb 2012)

faetzminator hat gesagt.:


> Man sollte also bei Software, die man verbreiten will, niemals Packages wie [c]com.sun[/c], [c]com.ibm[/c] etc. verwenden.


Ok. Ich hatte eigentlich nicht vor, die Anwendung zu verbreiten, dennoch würde ich gern von der Bibliothek wegkommen.



faetzminator hat gesagt.:


> Was macht diese interne Klasse? Gibts da nichts in [c]javax.swing[/c], was das gleiche kann?


Keine Ahnung. Die Bibliothek wird in einem CellRenderer verwendet, welcher in einer JList eingesetzt wird, um Zeilenumbrüche und Tabulator-Sprünge in den Listen-Einträgen darstellen zu können.
Ich habe ihn mit vielen Informationen aus dem Netz zusammengeschrieben. Durch den CellRenderer wird meine Anwendung leider auch etwas instabiler (vor allem bei sehr vielen Daten) - ich habe hier aber auch mit Unterstützung aus verschiedenen Foren keine Lösunge finden können. Die Anwendung ist zwar mittlerweile verwendbar, aber es gibt doch ab und an immer mal ein Einfrieren des Programms, welches dann gewaltsam getötet werden muss.
Auch aus diesem Grund bin ich gern gewillt, hier verschiedenes auszuprobieren.
Habt ihr evtl. ein paar Tipps, wie ich eine Verbesserung erreichen könnte?


```
@SuppressWarnings("serial")
class TabRenderer extends JTextArea implements ListCellRenderer {	// JTextArea supports tabs - JTextField and JLabel not!
    
	/**
	 * An empty <code>Border</code>. This field might not be used. To change the
	 * <code>Border</code> used by this renderer override the 
	 * <code>getListCellRendererComponent</code> method and set the border
	 * of the returned component directly.
	 */
	private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
	private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
	protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER;
 
	
	private Border getNoFocusBorder() {
		Border border = DefaultLookup.getBorder(this, ui, "List.cellNoFocusBorder");
		if(System.getSecurityManager() != null) {
			if (border != null) return border;
			return SAFE_NO_FOCUS_BORDER;
		} else {
			if(border != null && (noFocusBorder == null || noFocusBorder == DEFAULT_NO_FOCUS_BORDER)) {
				return border;
			}
			return noFocusBorder;
		}
	}

	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
		setComponentOrientation(list.getComponentOrientation());

		Color bg = null;
        Color fg = null;

        JList.DropLocation dropLocation = list.getDropLocation();
        
        if(dropLocation != null && !dropLocation.isInsert() && dropLocation.getIndex() == index) {
        	bg = DefaultLookup.getColor(this, ui, "List.dropCellBackground");
        	fg = DefaultLookup.getColor(this, ui, "List.dropCellForeground");
        	isSelected = true;
        }

	 	if(isSelected) {
	 		setBackground(bg == null ? list.getSelectionBackground() : bg);
	 		setForeground(fg == null ? list.getSelectionForeground() : fg);
	 	} else {
	 		setBackground(list.getBackground());
	 		setForeground(list.getForeground());
	 	}

	 	/*
	 	if(value instanceof Icon) {
	 		setIcon((Icon)value);
	 		setText("");
	 	} else {
	 		setIcon(null);
	 		setText((value == null) ? "" : value.toString());
	 	}
	 	*/

	 	setEnabled(list.isEnabled());
	 	setFont(list.getFont());
         
	 	Border border = null;
	 	if(cellHasFocus) {
	 		if(isSelected) {
	 			border = DefaultLookup.getBorder(this, ui, "List.focusSelectedCellHighlightBorder");
	 		}
	 		if(border == null) {
	 			border = DefaultLookup.getBorder(this, ui, "List.focusCellHighlightBorder");
	 		}
	 	} else {
	 		border = getNoFocusBorder();
	 	}
	 	setBorder(border);

	 	this.setDocument(new PlainDocument());     
	 	this.setText(value.toString()); 
	 	this.setTabSize(2);

	 	return this;
	}
}
```


----------

