Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Desktop-Applikationen und Grafik > Zwei unabhängige Teile in einem Applet realisieren
Antwort
 
Themen-Optionen
Alt 09.02.2006, 13:47   Nach oben    #1
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard Zwei unabhängige Teile in einem Applet realisieren

Hallo,
ich habe folgende Frage.

Ich würde gerne ein Applet schreiben, welches in zwei Teile aufgeteilt wurde. Eine linke und eine rechte Spalte. In der rechten Spalte sollte etwas Dynamisches ablaufen (Beispiel).

Wie gehe ich denn jetzt an so etwas heran?
Dem Applet einen LayoutManager (z.B. ein GridLayout) hinzufügen und in jede Spalte ein Panel "adden", welches dann die jeweiligen Komponenten enthält?

So würde ich da jetzt rangehen .. aber meine ersten Versuche sind irgendwie nicht wirklich von Erfolg gekrönt.
Ich habe das Problem, dass ich gar nicht sehe, ob mein LayoutManager eigentlich korrekt verwendet wird. Das verlinkte Beispiel nimmt weiterhin 100% des Applets ein.
Ich rufe in der init()-Methode des Applets eine Methode initDemo() auf, welche dann z.B. ein
Java Code:
  1. this.setSize(500,500);
und Ähnliches aufruft.
Dort werden also die Standard"sachen" des Applets gesetzt .. unter Anderem eben auch der LayoutManager.
Java Code:
  1. this.setLayout(new GridLayout(1,2);
  2. JPanel controlPanel = new JPanel();
  3. JPanel dynamicPanel = new JPanel();
  4. this.add(controlPanel);
  5. this.add(dynamicPanel);
Ich weiß jetzt nicht, wie ich es schaffe, dass die Panels auch nebeneinander dort angezeigt werden. (und sorry .. bin heute mit einer enorm langen Leitung gesegnet ... -)

Sollte es eine viel bessere Möglichkeit geben zwei unabhängige Teile zu realisieren so hör ich mir das natürlich sehr gerne an.
Danke für die Hilfe.

Grüße Ben.

EDIT:
Hm, also das find ich jetzt komisch (aber ich hab natürlich auch keine Ahnung *g*)
Java Code:
  1. this.setLayout(new GridLayout(1,2));
  2. System.out.println(this.getLayout());
ergibt die Ausgabe
Code:
java.awt.BorderLayout[hgap=0,vgap=0]



EDIT II:
Kann es sein, dass es daran liegt, dass ja aufgrund des Threads ständig die repaint()-Methode aufgerufen wird?
Wenn ich im linken Panel eine JToolBar mit zwei Buttons hinzufüge sind diese Buttons erstmal nicht sichtbar. Fahre ich aber mit der Maus darüber sind sie für kurze Zeit sichtbar (und zwar genau so lange, wie der Thread "schläft" (sleep()) .. und dann wird neu gezeichnet und die Toolbar bzw. die Buttons sind nicht mehr sichtbar.

Erklär mir das doch mal wer ..


EDIT III:
Eigentlich würde ich den Thread ja gerne nur auf den rechten Teil beziehen. Das wär fein

Geändert von Ben (09.02.2006 um 14:10 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 16:05   Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

also eine geneue antwort auf deine fragen kann ich dir leider nicht geben, aber ich würde mal zur übersichtlichkeit den gesamten malvorgang inclusive thread in ein eigenes objekt packen (z.B. ein Panel).
der thread ruft dann immer nur die replaint methode des panels auf und das gesamte applet wird nicht jede sekunde neugezeichnet.

so kannst du in aller ruhe(ohne das der thread läuft) dein layout zusammen basteln und das panel an der richtigen position einfügen, danach das ganze mit laufendem thread testen und ich glaube dann wird es funktionieren.

wenn hinzugefügte Komponenten nicht direkt angezeigt werden, versuch es mal mit der validate methode.
beny_mcde ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 17:35   Nach oben    #3
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hallo,
erst mal dank ich Dir für die Antwort. Ich habe das nun mal so gemacht, dass ich zum einen eine Klasse habe, die von JApplet erbt. Dort gibt es nun eine Methode, die folgendes enthält
Java Code:
  1. this.setSize(500,500);
  2. this.setBackground(Color.ORANGE);   
  3.        
  4. this.getContentPane().setLayout(new GridLayout(1, 2, 5, 5));
  5.  
  6. this.controlPanel = new ControlPanel();  
  7. this.dynamicPanel = new DynamicPanel();
  8.            
  9. this.add(this.controlPanel);
  10. this.add(this.dynamicPanel);
Jut. Die Klasse ControlPanel ist simpel und sieht so aus.
Java Code:
  1. import java.awt.*;
  2. import javax.swing.*;
  3.  
  4.  
  5. public class ControlPanel extends JPanel {
  6.  
  7.  
  8.     public ControlPanel() {
  9.         this.setBackground(Color.LIGHT_GRAY);
  10.        
  11.         JToolBar toolbar = new JToolBar();
  12.         toolbar.add(new JButton("Start"));
  13.         toolbar.add(new JButton("Pause"));
  14.         toolbar.add(new JButton("Stop"));
  15.        
  16.         this.add(toolbar);
  17.        
  18.     }
  19.      
  20. }

Wenn ich das nun laufen lasse, dann wird diese Toolbar erst angezeigt, wenn ich mit der Maus über die Buttons fahre. Wähle ich anstatt eines JButtons einen Button, also AWT anstatt Swing, dann werden sie angezeigt ...
Komisch, komisch .. warum ist das denn so?


EDIT:
Ich habe Deine obige Antwort eventuell nicht ganz verstanden, was die Auslagerung des Threads angeht.
Würde das dann so aussehen, dass die Klasse DynamicPanel von JPanel erbt und das Interface Runnable implementiert?

Geändert von Ben (09.02.2006 um 17:48 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 18:57   Nach oben    #4
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Also das hier funktioniert bei mir ohne Probleme:

PHP-Code:
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JToolBar;

public class 
TestApplet extends JApplet {

    private static final 
long serialVersionUID 1L;
    
    public 
void init() { 
    }
    
    public 
void start() {
        
this.setBackground(Color.ORANGE);
        
this.setLayout(new GridLayout(1255));
        
this.add(new ControlPanel());
        
this.add(new JPanel());
    }

}

class 
ControlPanel extends JPanel {

     private static final 
long serialVersionUID 1L;

    public 
ControlPanel() {

        
// Set Background for the the Panel
        
this.setBackground(Color.LIGHT_GRAY);
        
JToolBar toolbar = new JToolBar();
        
toolbar.add(new JButton("Start"));
        
toolbar.add(new JButton("Pause"));
        
toolbar.add(new JButton("Stop"));
        
this.add(toolbar);
    }


Zu deinem Code:
.setSize() aufzurufen ist unnötig, Applets wird bereits bei der Einbettung in der HTML-Seite die Größe mitgeteilt die hinterher auch nicht mehr variabel ist.
Das setzen der Hintergrundfarbe für das Applet nützt nichts wenn du darauf Panels mit einer anderen Hintergrundfarbe addest und dafür ein Layout vewendest, dass automatisch die Größe des Panels automatisch maximal anpaßt. Du siehst den bunten Hintergrund also nicht.
.JApplet.getContentPane() brauch nicht herangezogen zu werden, das ist bei Applets unnötig. Wenn du es trotzdem tust mußt du natürlich auch entsprechend nicht nur dein Layout darauf legen sondern auch alle Komponenten adden.
Also:
Container content = this.getContentPane();
content.setLayout[...]
content.add(new JComponent[...]


Gruß
Sparrow

Geändert von Ben (09.02.2006 um 19:00 Uhr).
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 19:14   Nach oben    #5
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Okay. Danke. Das funktioniert jetzt erstmal.
Ich nutze hier setSize(), weil ich mir das Applet im AppletViewer anschaue .. und da finde ich das dann ganz hilfreich.

Jetzt tritt dann aber auch direkt das nächste Problem auf.
Ich starte das Applet und jo .. dann ist erst mal nix zu sehen. Erst wenn ich die Größe des Applets verändere wird das Applet bzw. der Inhalt angezeigt.

Und irgendwie .. also .. lassen wir es erstmal bei dieser Frage. Die anderen Probleme, die es noch zu Hauf gibt, kann ich gerade noch nicht so wirklich beschreiben.
Kommt dann später

Danke erstmal, Grüße Ben.


EDIT:
Also ... hä?
Ich mach hier doch alles falsch. Kann doch echt nicht anders sein
Wenn ich folgende Klassen verwende
PHP-Code:
import java.awt.*;
import javax.swing.*;


public class 
Flipper extends JApplet {
    
    
    private 
JPanel controlPanelflipperPanel;
    
    
    public 
void start() {
        
this.initFlipper();
    }
    
    public 
void init() {}
    
    
    
    public 
void paint(Graphics g) {
        
Graphics2D g2d = (Graphics2D)g;
    }    

    private 
void initFlipper() {
        
this.setSize(800,500);
        
this.setLayout(new GridLayout(1255));

        
this.controlPanel = new ControlPanel();    
        
this.flipperPanel = new FlipperPanel(); 
            
        
this.add(this.controlPanel);
        
this.add(this.flipperPanel);
    }
    

PHP-Code:
import java.awt.*;
import javax.swing.*;


public class 
FlipperPanel extends JPanel implements Runnable {

    private 
int a 1010width 10height 10;
    
    private 
Thread thread;
    
    private 
Image bufferedImage;
    private 
Graphics2D bufferedGraphics;    
    
    
    public 
FlipperPanel() {
        
this.thread = new Thread(this);
        
this.thread.start();
    }
    
    
    public 
void run() {

        while(
true) {

            
this.+= 5;
            
this.+= 5;
            
            
repaint();
            
            try {
                
Thread.sleep(500);
            } catch(
InterruptedException ex) {
            }
        }
    }    
    
    
    public 
void update(Graphics g) {
        
        
Graphics2D g2d = (Graphics2D)g;
        
        if (
this.bufferedImage == null) {
            
this.bufferedImage    createImage(this.getSize().widththis.getSize().height);
            
this.bufferedGraphics = (Graphics2D)this.bufferedImage.getGraphics();
        }
        
        
this.bufferedGraphics.setColor(this.getBackground());
        
this.bufferedGraphics.fillRect(00this.getSize().widththis.getSize().height);
        
this.bufferedGraphics.setColor(this.getForeground());
        
        
this.paint(this.bufferedGraphics);
        
        
g2d.drawImage(this.bufferedImage00this);
    }    
    
    
    public 
void paint(Graphics g) {
        
Graphics2D g2d = (Graphics2D)g;
        
        
g2d.drawRect(this.athis.bthis.widththis.height);
    }        
        

PHP-Code:
import java.awt.*;
import javax.swing.*;


public class 
ControlPanel extends JPanel {


    public 
ControlPanel() {
        
        
this.setBackground(Color.LIGHT_GRAY);
        
        
JToolBar toolbar = new JToolBar();
        
toolbar.add(new JButton("Start"));
        
toolbar.add(new JButton("Pause"));
        
toolbar.add(new JButton("Stop"));
        
toolbar.setFloatable(false);
        
toolbar.setLocation(new Point(0,0));
        
        
this.add(toolbar); 
    }
      

(Ohne jegliche Kommentare, die Namen lassen wir jetzt mal komplett unbeachtet .. ich bin - wie man sicherlich merkt - gerade in einer "Alles-Mögliche-Austest-Phase".)

.. erhalte ich das Ergebnis, was man im Anhang bewundern kann
Meeeenno .. doof.
Angehängte Grafiken
Dateityp: jpg applet.jpg (20,6 KB, 5x aufgerufen)

Geändert von Ben (09.02.2006 um 19:20 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 19:26   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 425
Standard

wenn ich das richtig weiß haben die Componenten aus javax.swing das problem, dass sie meist von paint() übermalt werden (auch wenn du nicht direkt irgend etwas drüber malst..) im gegensatz zu java.awt - Componenten.
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 19:26   Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

Zitat:
Jetzt tritt dann aber auch direkt das nächste Problem auf.
Ich starte das Applet und jo .. dann ist erst mal nix zu sehen. Erst wenn ich die Größe des Applets verändere wird das Applet bzw. der Inhalt angezeigt.
Versuch mal die Methode pack(); die plaziert alle Komponenten auf dem Panel.
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 19:30   Nach oben    #8
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von karahead
Versuch mal die Methode pack(); die plaziert alle Komponenten auf dem Panel.
Ähm .. wo soll ich die denn nutzen?
Ich habe doch gar kein passendes Objekt!?

@Xean:
Jou, aber ich will keine AWT-Komponenten nutzen .. und es muss ja auch mit Swing gehen.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 19:43   Nach oben    #9
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

Na in ControlPanel und FlipperPanel zum Beispiel. Aber erst nach dem adden der Komponenten aufrufen, sonst nützt es nichts.
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 20:01   Nach oben    #10
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Zitat:
Zitat von karahead
Versuch mal die Methode pack(); die plaziert alle Komponenten auf dem Panel.
Ähm.. nö.
pack() setzt bei einem Fenster die Größe so, dass alle Komponenten rein passen
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2006, 20:04   Nach oben    #11
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

@sparrow
Mein ich doch
Hab's mir bis jetzt immer so gemerckt, sorry.
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten