Zum Inhalt springen

Container auf Frame adden und Frame aktualisieren?


btcMoses

Empfohlene Beiträge

Tach zusammen,

ich spiele Grad mit AWT/Swing.

ich habe in nem JFrame eine methode geschrieben die von extern daten annimmt und daraus ein container erstellt und ihn dem Frame hinzufügt.

Mein problem ist, dass ich die Änderung nicht sehe, es sollte ja ein neuer Container(panel mit nem button) auf dem Frame entstehen.

Wie sage ich dem Frame, dass es nen neuen Container bekommen hat?

Ich habe schon einiger Listener angesehn aber nichts gefunden..

Wer weis wie das funktionert?

Gruß

moses

Link zu diesem Kommentar
Auf anderen Seiten teilen

hm ne das hab ich drin.

Dieser Code ruft die geschriebene Methode in der Frame-Klasse auf:


GUI fenster = new GUI();

fenster.setVisible(true); // wenn ich das nach der while Schleife setze gehts, aber das Fenster soll schon existieren und sichtbar sein.


ResultSet rs = stmt.executeQuery("SELECT * from pictures;");

while (rs.next()){

	Blob data = rs.getBlob( "pic" );

	fenster.addPicturePanel(data.getBytes(1, (int) data.length()),rs.getString("name"));

	}

Hier die Methode

public void addPicturePanel(byte[] picture, String name){

	Icon image = new ImageIcon(picture);

	JPanel panel = new JPanel();

	panel.setLayout(new BorderLayout());

	panel.setBorder(BorderFactory.createTitledBorder(null, name, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));

	JLabel label = new JLabel(image);

	JButton button = new JButton();

	button.setText("jetzt kaufen");

	panel.add(label,BorderLayout.NORTH);

	panel.add(button,BorderLayout.SOUTH);

	this.add(panel);

}

Es fehlt das Stück Code, das den Frame dazu animiert sein neues Panel auch zu zeichnen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann probiere doch bitte einmal folgendes


GUI fenster = new GUI();

fenster.setVisible(true); // wenn ich das nach der while Schleife setze gehts, aber das Fenster soll schon existieren und sichtbar sein.


ResultSet rs = stmt.executeQuery("SELECT * from pictures;");

while (rs.next()){

	Blob data = rs.getBlob( "pic" );

	fenster.addPicturePanel(data.getBytes(1, (int) data.length()),rs.getString("name"));

	}

[B]fenster.pack();[/B]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probier mal, nach dem Hinzufügen folgendes:

GUI fenster = new GUI();

fenster.setVisible(true); // wenn ich das nach der while Schleife setze gehts, aber das Fenster soll schon existieren und sichtbar sein.


ResultSet rs = stmt.executeQuery("SELECT * from pictures;");

while (rs.next()){

	Blob data = rs.getBlob( "pic" );

	fenster.addPicturePanel(data.getBytes(1, (int) data.length()),rs.getString("name"));

	}

[B]fenster.invalidate();[/B]

Das ist eine von der Klasse Container geerbte Methode, von der veranlasst wird, das Layout im JFrame neu aufzusetzen, mit allen Komponenten, die jetzt enthalten sind

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, leider funktioniert dies garnicht.

fenster.repaint(); wäre auch ne möglichkeit.. leider geht das aber auch nicht.

Das war auch die Antwort meines Informatiklehrers, aber geht ja nich.. er faselste noch was von paint() überschreiben und das das zu kompliziert ist un er das direkt am Quellcode zeigen muss.

Aber das kann ja nich so aufregend sein.

Is denn die Vorgehensweise überhaupt auch so ok?

Link zu diesem Kommentar
Auf anderen Seiten teilen

auch das bringt nix

ich habe jetzt nochmal was anderes probiert:

eine neue Klasse..


import java.awt.*;

import javax.swing.*;

import javax.swing.border.TitledBorder;


public class PicturePanel extends JComponent{

	JPanel Panel = new JPanel(); 


    public PicturePanel(GUI mainFrame, byte[] picture, String name) {   	

    	Panel.setLayout(new BorderLayout());

		Panel.setBorder(BorderFactory.createTitledBorder(null, name, TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));


    	Icon image = new ImageIcon(picture);

		JLabel label = new JLabel(image);


		Panel.add(label,BorderLayout.CENTER);

		mainFrame.add(Panel).setVisible(true);

		setPreferredSize(Panel.getSize());

    } 

}

aufgerufen durch:

fenster.getContentPane().add(new PicturePanel(fenster,data.getBytes(1, (int) data.length()),rs.getString("name")));

...immernoch das selbe Problem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 Monate später...

Hey, ich bin über Google auf dieses Thema gestoßen und habe gerade genau das selbe Problem, und finde keine Lösung.

mal Vorab, ich erhalte von einem BildanalyseThread ein PlanarImageArray, in dem 3 Bilder enthalten sind. Das erste wird direkt von einer Webcam in das Array geschrieben. Dann habe ich dieses Bild nochmals in ein Graustufenbild umgewandelt und anschließend noch binarisiert, und setze diese dann zusätzlich in das Array. In dem BildanalyseThread werden durchweg Bilder aus der Camera genommen analysiert und in das Array geschrieben, also werden die Bilder in dem Array immer aktualisiert.

Nun zu meinem Problem. Ich bekomme in meinem JFrame nur das erste Bild und die bearbeiteten Bilder des ersten Frames angezeigt, weitere werden nicht angezeigt.

Vielleicht wisst ihr ja um Rat :-)

import java.awt.GridLayout;

import java.awt.Image;

import java.util.concurrent.Semaphore;


import javax.media.jai.PlanarImage;

import javax.swing.ImageIcon;

import javax.swing.JFrame;


import com.sun.media.jai.widget.DisplayJAI;


public class Gui extends JFrame implements Runnable {

	private static final long serialVersionUID = 158632595136627636L;


	private ImageIcon icon = new ImageIcon("./logo.jpg");


	private Image icon_image = icon.getImage();


	private PlanarImage[] imageList = new PlanarImage[3];


	public static Semaphore lock = new Semaphore(0);


	public void initFrame() {

		this.setName("WifiBot: analysis");

		this.setDefaultCloseOperation(3);

		this.setResizable(false);

		this.setAlwaysOnTop(true);

		this.setLocation(20, 20);

		this.setVisible(true);


		this.setLayout(new GridLayout(3, 1));


		try {

			Gui.lock.acquire();

			this.getContentPane().add(new DisplayJAI(imageList[0]));

			this.getContentPane().add(new DisplayJAI(imageList[1]));

			this.getContentPane().add(new DisplayJAI(imageList[2]));

			this.setIconImage(icon_image);

		} catch (InterruptedException e) {

			e.printStackTrace();

		}

		this.pack();

	}


	public void run() {

		initFrame();

		while (true) {

			this.invalidate(); //nur testweise

			this.repaint(); 

			this.setVisible(true); //nur testweise

		}

	}


	public synchronized void setImages(PlanarImage[] imagelist) {

		this.imageList = imagelist;

	}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen


GUI fenster = new GUI();

fenster.setVisible(true); // wenn ich das nach der while Schleife setze gehts, aber das Fenster soll schon existieren und sichtbar sein.


ResultSet rs = stmt.executeQuery("SELECT * from pictures;");

while (rs.next()){

	Blob data = rs.getBlob( "pic" );

	fenster.addPicturePanel(data.getBytes(1, (int) data.length()),rs.getString("name"));

	}

fenster.setVisible(false);

fenster.setVisible(true);


und das ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit

fenster.pack();

geht das schon aber pass auf so wie du das Programmiert hast wird das neue Panel einfach ANGEFÜGT, deshalb auch die Verschiebungen. Lösche vorher alle elemente auf dem Fenster (glaub das geht mit removeAll(Fenster)) dann funktionierts auch mit der Nachbarin.

Noch ne Info: Wenn du bei Fester eine größe mitgiebst musst du die nach Pack auch nochmal einstellen Fenster.Size(x,y) Weil pack() zumindest unter AWT die Optimale größe für das Fenster errechnet und ansetzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist das nicht, wenn Die Bilder in "Echtzeit" rein kommen zu langsam? Kannst Du nicht einfach 3 leere Bilder im Layout anlegen, und nur die Inhalte immer wieder updaten, ohne die gesamten Komponenten zu entfernen und neu zu adden?

Ich meine mich erinnern zu können, dass man das in einer Imagekomponente machen kann.

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...