(JScrollpane) Laden nur bestimmter Bilder

Ok, schaue ich Morgen mir nochmal an, es tut mir Leid, aber mein Gehirn macht das Heute nicht mit.^^

Trotzdem danke für das Intresse an der Lösung meines Problems und nochmal Danke an die Erklärung von @Timothy_Truckle .

Ich bin aber jetzt erstmal weg…
Nacht

Mit freundlichem Gruß,
MrSmile07

Also ich habe mich jetzt dran gesetzt und habe es mit Hilfe des Quelltextes von @Marco13 herrausgefunden.

Also im groben ist die Lösung so:

private void computeVisibleButtonsOn(JPanel panel){
		
        Rectangle visibleRect = panel.getVisibleRect();
        int y0 = visibleRect.y / rectangle;
        double ny = (double)visibleRect.height / rectangle;
        int y1 = y0 + (int)Math.ceil(ny);
       
        int lstart = 5*y0; //5
        int lstop = 5*y1;
        int i = 0;

        while(i <= panel.getComponentCount()-1){
        	
        	if(i < lstart || i > lstop){
        		((CustomButton) (panel.getComponent(i))).setImageIcon(null);
        	}else{
        		((CustomButton) (panel.getComponent(i))).setImageIcon(((CustomButton) (panel.getComponent(i))).getName());
        	}
        	
        	i++;
        }
    }
	
	public static void addlas2(){
		Main.getScrollpane().getVerticalScrollBar().addAdjustmentListener(las2);
	}

Nochmal ein Danke an alle die mir probiert haben zu helfen und mich auf den richtigen weg gebracht haben.^^

Ich setze das Thema hiermit auf “gelöst”.

Mit freundlichem Gruß,
MrSmile07

Nicht besonders hübsch. Aber vermutlich geht es dir darum gar nicht.

Naja was heißt “nicht hübsch”?^^XDDDD

PS: Hat aber immernoch Probleme mit dem Java Heap space, aber egal.^^

Mit freundlichem Gruß,
MrSmile07

Gesendet von meinem LG-H735 mit Tapatalk

och, da gibt es vieles wo man meckern könnte :smiley: und je detaillierter man schaut, desto weiter
bewegt man sich von „code hinschreiben der irgendetwas macht“ richtung „software entwickeln“ (Zitat @Marco13 ) …

fangen wir doch mal an… :smiley:

while(i <= panel.getComponentCount()-1)

die methode getComponentCount() wird bei jedem durchlauf neu aufgerufen…
angenommen die methode würde eine größere zeitspanne benötigen,
wäre es besser, sie nur einmal aufzurufen…
Zeile 16-18 doppelter code…
das ganze ist eigentlich eine for schleife…
was genau soll lstart und lstop heißen…

naja und so weiter und so fort ^^

@mymaksimus Nein es ist von nöten das die Methode jedes mal aufgerufen wird, da man auch Elemente löschen kann.

Lstart und lstop wird doch da erzeugt also kennt man ja schon was es macht.

Mit freunlichem Gruß,
MrSmile07

Gesendet von meinem LG-H735 mit Tapatalk

ich meinte das so:

int count = panel.getComponentCount();
schleife(…)

während die schleife läuft kann ja niemand ein element löschen ^^

Ich verstehe leider nicht genau was gemeint ist.

Mit freunlichem Gruß,
MrSmile07

Gesendet von meinem LG-H735 mit Tapatalk

Der Hinweis von mymaksimus bezog sich darauf, dass man sich überlegen sollte, ob man

while(i <= panel.getComponentCount()-1) { ... }

schreibt, oder

int componentCount = panel.getComponentCount();
while(i <= componentCount-1) { ... }

(bzw. gleich

int componentCount = panel.getComponentCount();
while(i < componentCount) { ... }

). Das macht in mehrerer Hinsicht einen Unterschied, aber ich finde das weniger wichtig als die Tatsache, dass das vermutlich eher eine “for”-Schleife sein sollte.

Noch häßlicher finde ich aber die die nichtssagenden magischen Konstanten “5” in

        int lstart = 5*y0; //5
        int lstop = 5*y1;

(was bedeutet das? Warum 5?), und die casts und Zugriffe in

 ((CustomButton) (panel.getComponent(i))).setImageIcon(null);

Irgendein “Datenmodell” dafür könnte nicht schaden, aber das hängt mit all den anderen offenen Fragen zusammen…

@Marco13 Also das mit der Schleife ist so beabsichtigt.

Die 5 Steht für 5 Elemente in einer Reihe, da in einer Reihe durch meine Vorgabe nicht mehr als 5 Elemente seien dürfen. (GridLayout mit 5 Spalten mit einer Höhe von 0)
Jedes Elemt hat auch die Breite des Bildschrims durch 5.

Meine Buttons sind alle CustomButtons.

Wenn ich dann mit der Schleife jedes Element durch gehe muss ich jedes Element zu CustomButton casten, da mein Button ein final in einer for Schleife ist.

Ich hoffe ich konnte dir damit helfen.^^

Mit freundlichem Gruß,
MrSmile07

Tja. An wie vielen Stellen musst du welchen Code ändern, wenn du irgendwann DOCH mal 6 Spalten haben willst? Willst du dann ein globales „Suchen-Und-Ersetzen“ machen, und alle "5"s in "6"s ändern? :wink:

Und… ich könnte mich spontan nicht erinnern, dass ich in den >20 Jahren, die ich jetzt Java (und viel Swing) programmiere, mal ernsthaft eine Klasse ...extends JButton erstellt habe.

Aber… das muss natürlich alles nichts heißen. „Erfahrung“ bedeutet manchmal nur, dass man eine Sache schon sehr lange falsch macht.

@Marco13 Joah ich bin halt noch frisch in Java zwar nicht unerfahren aber noch nicht ein Profi.^^
Und ich brauchte einen eigenen Button wegen:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;


public class CustomButton extends JButton{

	private static final long serialVersionUID = 1L;
	
	private String text;
	
	private Image img;

	private JPanel p;
	
	public CustomButton(JPanel p){
		this.p = p;
	}
	
	@Override
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		
		//load();
		
		g.drawImage(img, 0, 0, getWidth(), getHeight(), p);
		//System.out.println(imageForOne.getIconHeight() + " " + imageForOne.getIconWidth());
		//System.out.println(getWidth() + " " + getHeight());
		g.setColor(new Color(0,0,0,40));
		g.fillRect(0, getHeight()-40, getWidth(), 40);
		
		g.setColor(Color.WHITE);
		g.drawString(text, 10, getHeight()-15);

	}
	
	public void setTextToPrint(String text){
		this.text = text;
	}
	
	public void setImageIcon(String path){
		if(path != null){
			//this.getClass().getResource("/img/Folder.png")
			img = new ImageIcon(path).getImage();
			repaint();
		}else{
			img = null;
		}
	}
}

Mit freundlichem Gruß,
MrSmile07

OK, bisher bin ich die ganze Zeit davon ausgegangen, dass du die Bilder als “ImageIcon” (direkt mit “button.setIcon(…)”) auf die Button legst. Für eigene Zeichenoperationen kann zwar ein erweiterter JButton OK sein, aber … ob das hier angebracht ist, kann ich gerade nicht beurteilen. Zumindest hinterfrage ich es mal: Warum verwendest du nicht “normale” (nicht-erweiterte) JButtons, und button.setIcon(new ImageIcon(...));?

(Nochmal der Hinweis aufs Datenmodell. So einen “Zustand” NUR in einer GUI-Component zu speichern ist immer suspekt, aber das jetzt auszubreiten würde vielleicht zu weit führen)

@Marco13 Das ist deswegen wegen den Zeilen:

        g.setColor(new Color(0,0,0,40));
        g.fillRect(0, getHeight()-40, getWidth(), 40);
       
        g.setColor(Color.WHITE);
        g.drawString(text, 10, getHeight()-15);

Ich möchte halt das der Button beschriftet ist und zwar unten links in der Ecke und mit einem Hintergrund damit man die Schrift ÜBERALL lesen kann.
Und das ist der Grund weswegen ich mit Graphics g arbeiten muss.

Allerdings braucht das immernoch obwohl ich jetzt schon mit dem speichern runterfahre immernoch sehr viel Ram…

Also ich möchte meinen Quellcode eigentlich nur sehr ungerne zeigen aus 3 Gründen:

  1. Der Quellcode ist in 28 Klassen unterteilt
  2. Ich möchte ungerne zeigen wie schlampig ich programmiere :P^^
  3. Weil ich keine Kopierer mag. ^^

Mit freundlichem Gruß,
MrSmile07

[quote=MrSmile07]Ich möchte halt das der Button beschriftet ist und zwar unten links in der Ecke und mit einem Hintergrund damit man die Schrift ÜBERALL lesen kann.
Und das ist der Grund weswegen ich mit Graphics g arbeiten muss.[/quote]Aslo eigentlich spricht nichts dagegen, beide Techniken zu mischen, d.h. die Bilder mit ImageIcon zu setzten und die Beschriftung anschließen (nach Aufruf von super.paintComponent()) zu zeichnen.

bye
TT

Ja, ob durch sowas wie
button.setHorizontalTextPosition(…);
button.setVerticalTextPosition(…);
der Text nicht schon an die gewünschte Stelle bugsiert werden kann, müßte man mal schauen.

2 Ich möchte ungerne zeigen wie schlampig ich programmiere ^^
3. Weil ich keine Kopierer mag. ^^

Ich glaube, oft, wenn 3. als Grund angegeben wird, ist eigentlich 2. der Fall :wink:

@Timothy_Truckle hatte ich probiert aber paintComponent zeichnet anscheined über das Bild wodurch es nicht mehr angezeigt wurde.

@Marco13 ich hatte das damit probiert und habe unregelmäßige verbuggte Positionen erhalten.

Und zu letzterem könnte natürlich auch möglich sein.^^XDDD

Mit freundlichem Gruß,
MrSmile07

PS: Frage mich trotzdem warum PaintComponent mehr Ramspeicher braucht um das Bild zu zeichnen als .setIcon()… komisch

Gesendet von meinem LG-H735 mit Tapatalk

Das tut es nicht. Und das hat auch nichts miteinander zu tun. Aber … die Frage, wie du den Speicherverbraucht denn misst (bzw. zu messen glaubst) wäre vielleicht auch nicht ganz unwichtig.

@Marco13 Ich bekomme bei Eclipse erstens die Meldung java heap space error vom image fetcher und animations fetcher und ich messe das mit “Process Hacker” einem Taskmanager den ich gerne benutze, ich gucke aber gleich ob die Bilder die mein Programm nicht fehlerhaft sind. (Kam mir grade so als Ider)

Mit freundlichem Gruß,
MrSmile07

Gesendet von meinem LG-H735 mit Tapatalk

Ja, der Taskmanager an sich kann ja nur sagen, wie viel Speicher sich “Java” (also die JVM) geschnappt hat. Wie viel davon tatsächlich verwendet wird, ist eigentlich eine andere Frage. Dafür könnte man dann z.B. “jVisualVM” verwenden (ist direkt beim JDK dabei), oder irgendwas ausgefeilteres (Java Mission Control Flight Recorder).