Dialog "übermalt" Teile des Frames

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich bin gerade dabei ein Zeichenprogramm in Java zu erstellen (awt). Soweit, so gut...

Ich habe mein Frame in dem ich auch zeichnen kann. Jetzt habe ich einen Menüpunkt "Info", bei dem ein Infodialog eingeblendet wird. Schieße ich diesen wieder, ist genau an der Stelle, an der er zu sehen war, alles gelöscht, was dort vorher gemalt wurde.

Kann da jemand so ganz pauschal sagen woran das liegt ? Oder braucht ihr dazu noch was von meinem Quelltext ?
 
R

Roar

Gast
du musst danach deine zeichenfläche neuzeichnen lassen vom programm. vergiss nicht vorher zu speichern was der benutzer gemalt hat.
 

Pasche

Bekanntes Mitglied
Ist das wirklich die einzige Möglichkeit ? Scheint mir etwas kompliziert zu sein, oder nicht ?

Zumal ja der Dialog auch verschoben werden kann. Dabei sieht der Benutzer ja bereits dieses übermalen. Dann müsste ich ja bei jedem Verschieben die Fläche neuzeichnen. Aber wie mache ich das ?
 
B

Beni

Gast
Pasche hat gesagt.:
Ist das wirklich die einzige Möglichkeit ? Scheint mir etwas kompliziert zu sein, oder nicht ?
Du musst irgendwo speichern, was der Benutzer gemalt hat, alles andere ist Haferkäse.
Denn das Bild auf einer Component kann jederzeit zerstört werden, z.B. durch ein Dialog.
Wenn ein Bild zerstört wurde, wird die Methode "paint" der Component aufgerufen (das geschieht automatisch), und innerhalb dieser Methode (die du wahrscheinlich überschrieben hast :wink: ), zeichnest du das vorher gespeicherte Bild.
Kompliziert ist was anderes... :wink:

Code:
public class PaintPanel extends JComponent{
  public void paintComponent( Graphics g ){  // alles was von JComponent erbt, sollte diese Methode, und nicht "paint" überschreiben.

     g.setColor( sowieso );
     g.fillRec( 0, 0, getWidth(), getHeight() ); // Hintergrund löschen.

     for( int i = 0; i < 10; i++ ){  // Irgendwo ist gespeichert, was der Benutzer gemacht hat. z.B. in einem Array, oder einem Vector...
        g.setColor( blupp );
        ...
     }

  }
}
 

Pasche

Bekanntes Mitglied
Mich hätte an dieser Stelle interessiert, wie ich die Sachen speicher. Eigentlich könnte ich doch jeden einzelnen Bildpunkt durchgehen und die Farbe abfragen, oder sehe ich das falsch ?
 

Pasche

Bekanntes Mitglied
oh man, ich bin doch java anfänger :cry: leider muss ich diese aufgabe machen :roll:

vielleicht ein wenig "anfängerfreundlicher" ?
 
R

Roar

Gast
äh sorry aber ich versteh nicht was du nicht verstehst. schreib ne eigene klasse für jedes zeichenbare objekt welches die daten wie pos, y pos und farbe und sowas beinhaltet und die methode paint implementiert, leg für jedes vom user gezeichnete instanz von der entsprechenden klasse an, speicher sie, und beim nbeuzeichnen der zeichenfläche rufst du von jedem gespeichertem objekt die paint methode mit dem aktuellen Graphics als parameter auf.
 

Pasche

Bekanntes Mitglied
wenn du das deiner mutter erklären würdest.......würde sie es verstehen ? :wink:

ich habe schon einiges mit C++ und Delphi gemacht, aber das ist jetzt das erste Java Programm. Ich habe keine Ahnung von dieser awt-Programmierung und versteh leider gar nichts von dem was du mir gesagt hast
 
R

Roar

Gast
1. meine mutter weiß nichtmal wo man den komputa anmacht geschweige denn was irgendwas, was nach dem anschalten kommt, bedeutet ;)

2. werd mal was konkreter: was verstehst du nicht? du erwartest doch jetz nicht dass ich dir den sourcecode jetz schriebe, oder? benutz außerdem mal die suchfunktion: das thema wurde schon öfters besprochen
 

Pasche

Bekanntes Mitglied
zu 1: ich weiß ganz genau was du meinst. Ist überall das Gleiche :D

zu 2: ich möchte ganz bestimmt keinen ganzen Quelltext haben. Also mal von vorne....

Eine Klasse für jedes zeichenobjekt mit den genannten Daten bekomme ich wohl hin. Aber dann:

und die methode paint implementiert, leg für jedes vom user gezeichnete instanz von der entsprechenden klasse an, speicher sie, und beim nbeuzeichnen der zeichenfläche rufst du von jedem gespeichertem objekt die paint methode mit dem aktuellen Graphics als parameter auf.

Paint implementieren ? Instanz anlegen ? :roll: Scheiße, ich werd zu alt für sowas :(
 
B

Beni

Gast
Roar meint wohl sowas:
Code:
public interface Paintable{
  public void paint( Graphics g );
}

Code:
public class Line implements Paintable{
  public void paint( Graphics g ){
    g.drawLine( ... );
  }
}

Code:
public class PaintPanel extends JComponent{
  private Vector<Paintable> paints = ...

  public void paintComponent( Graphics g ){
    for( x : paints )
      x.paint( g );

    /*
     für alt-Java-Anhäger ausgeschrieben  :-)

     for( int i = 0; i < paints.size(); i++ )
        ((Paintable)paint.get(i)).paint( g );
    */

  }
}
 

Pasche

Bekanntes Mitglied
Ich weiß eure Hilfe zu schätzen und es ist ja sicherlich alles ganz lieb gemeint, aber ich kann mit den Antworten überhaupt nichts anfangen :cry:

Ich zeige euch einfach mal was ich bis jetzt hier habe:

Code:
import java.awt.*;
import java.awt.event.*;

public class PaLiMa extends Frame implements ActionListener
{
   
  Color farbe = new Color(0,0,0);
  int  gitterstatus = 0;
  
  public void paint( Graphics g )
   {


   }
    
    public void test(int x, int y, int breite, int hoehe)
    {
    	Graphics g = getGraphics();
    	g.setColor(farbe);
    	g.drawRect(x, y, breite, hoehe);
    	g.fillRect(50, 300, 100, 200 );
    }


public PaLiMa()
    {
      super("PaLiMa A0.1");
      //setBackground(Color.lightGray);
      setLayout(new FlowLayout());
      setSize(800,600);
      
      //Positioniert das Fenster in der Mitte des Bildschirms
	  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	  setLocation( (d.width - getSize().width ) / 2,
               	   (d.height- getSize().height) / 2 );
      		
	
		
      setMenuBar(new MainMenu(this));
      setResizable(false);
    
      //Dialog-Button
      Button button = new Button("Dialog");
      button.addActionListener(this);
      add(button);

      //Gitternetz-Button
      button = new Button("Gitternetz");
      button.addActionListener(this);
      add(button);

      //Loeschen-Button
      button = new Button("Loeschen");
      button.addActionListener(this);
      add(button);

       //Test-Button
      button = new Button("Test");
      button.addActionListener(this);
      add(button);

      //Window-Listener
      addWindowListener(
         new WindowAdapter() {
            public void windowClosing(WindowEvent event)
            {
               setVisible(false);
               dispose();
               System.exit(0);
            }
         }
      );
   }
  
   public void actionPerformed(ActionEvent event)
   {
      String cmd = event.getActionCommand();
      if (cmd.equals("Dialog")) {
         InfoWnd dlg = new InfoWnd(this);
         dlg.setVisible(true);
      } else if (cmd.equals("Loeschen")) {
         repaint();
      } else if (cmd.equals("Test")) {    
         farbe = new Color(100,0,0);
         test(50, 50, 100, 200);
      }
   }
   
   public static void main(String[] args)
   {
      PaLiMa wnd = new PaLiMa(); 
      wnd.setVisible(true);
   } 
}

Das Hauptmenü des Frames habe ich in einer Klasse, aber das dürfte ja hier nicht interessieren, oder ?
Vielleicht kann mir jetzt jemand etwas konkreter helfen ?
 
B

Beni

Gast
Derselbe Code, nur ganz leicht abgeändert:
Code:
interface Paintable{
	public void paint( Graphics g );
}


class Rect implements Paintable{
	private int x, y, w, h;
	private Color color;
	
	public Rect( Color color, int x, int y, int w, int h ){
		this.color = color;
		this.x = x;
		this.y = y;
		this.w = w;
		this.h = h;
	}
	
  public void paint( Graphics g ){
  	g.setColor( color );
    g.drawRect( x, y, w, h );
  }
}

class PaLiMa extends Frame implements ActionListener
{
   private Vector paints = new Vector();  //######### das ist neu
	
  Color farbe = new Color(0,0,0);
  int  gitterstatus = 0;
  
  public void paint( Graphics g ){  // ######## das verändert
  	g.setColor( Color.BLACK );
  	g.fillRect( 0, 0, getWidth(), getHeight() );
  	
  	for( int i = 0; i < paints.size(); i++ )
  		((Paintable)paints.get(i)).paint( g );
   }
    
    public void test(Color farbe, int x, int y, int breite, int hoehe) // ####### das verändert
    {
    	paints.add( new Rect( farbe, x, y, breite, hoehe ) );
    	repaint();
    }


    public PaLiMa()
    {
      super("PaLiMa A0.1");
      //setBackground(Color.lightGray);
      setLayout(new FlowLayout());
      setSize(800,600);
      
      //Positioniert das Fenster in der Mitte des Bildschirms
	  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	  setLocation( (d.width - getSize().width ) / 2,
               	   (d.height- getSize().height) / 2 );
      		
	
		
      setMenuBar(new MainMenu(this));
      setResizable(false);
    
      //Dialog-Button
      Button button = new Button("Dialog");
      button.addActionListener(this);
      add(button);

      //Gitternetz-Button
      button = new Button("Gitternetz");
      button.addActionListener(this);
      add(button);

      //Loeschen-Button
      button = new Button("Loeschen");
      button.addActionListener(this);
      add(button);

       //Test-Button
      button = new Button("Test");
      button.addActionListener(this);
      add(button);

      //Window-Listener
      addWindowListener(
         new WindowAdapter() {
            public void windowClosing(WindowEvent event)
            {
               setVisible(false);
               dispose();
               System.exit(0);
            }
         }
      );
   }
  
   public void actionPerformed(ActionEvent event)
   {
      String cmd = event.getActionCommand();
      if (cmd.equals("Dialog")) {
         InfoWnd dlg = new InfoWnd(this);
         dlg.setVisible(true);
      } else if (cmd.equals("Loeschen")) {
         repaint();
      } else if (cmd.equals("Test")) {    
         test(new Color(100,0,0), 50, 50, 100, 200);
      }
   }
   
   public static void main(String[] args)
   {
      PaLiMa wnd = new PaLiMa(); 
      wnd.setVisible(true);
   } 
}
 

Pasche

Bekanntes Mitglied
Bei Zeile 26 erhalte ich die Fehlermeldung "Cannot Resolve Symbol". Vektor ist anscheinend nicht bekannt. Muss ich dafür noch was bestimmtes importieren ?

Ach, und nochwas: wenn ich jetzt test aufrufe...wie muss ich die Farbe übergeben ? Damit hatte ich auch schon immer Probleme. sowas wie:

Code:
test(black, 10, 10, 10, 10);

Oder muss da noch ein Color vor wie

Code:
test(Color.black, 10, 10, 10, 10);

???
 
B

Beni

Gast
Stimmt, der import von "java.util.Vector" muss noch dazu.

Pasche hat gesagt.:
Ach, und nochwas: wenn ich jetzt test aufrufe...wie muss ich die Farbe übergeben ? Damit hatte ich auch schon immer Probleme. sowas wie:

Code:
test(black, 10, 10, 10, 10);

Oder muss da noch ein Color vor wie

Code:
test(Color.black, 10, 10, 10, 10);

???
Es muss einfach ein Color-Objekt übergeben werden, da gibt es verschiedene Varianten:
Code:
test( Color.black, ... 

Color c = new Color( 255, 0, 50 );
test( c, ...

test( new Color( 255, 0, 100 ), ...

test( methodeMitRueckgabeColor(), ...
 
R

Roar

Gast
@Beni: ja genau das meinte ich. wenn ich mich nicht irre wurde genau das gleiche muster mit dem Paintable interface woanders schonmal vorgeschlagen ( wahrscheinlich von dir :lol: )
 
B

Beni

Gast
Ich erinnere mich auch an sowas, aber ich hab keine Lust das Forum nach diesem Thread zu durchsuchen...
 

Pasche

Bekanntes Mitglied
Erstmal vielen Dank dafür. Es funktioniert jetzt endlich. Zudem konnte ich mal sehen, wie man mit den Klassen vernünftig umgeht.

Eine Frage hätte ich da aber noch. Wie lösche ich denn jetzt das komplette Bild wieder ?
 
B

Beni

Gast
Mit der Methode "clear":
Code:
Vector paints = ...
paints.clear();

Was Vector sonst noch kann, kannst du in der API nachlesen.
 

Pasche

Bekanntes Mitglied
Na wunderbar. Jetzt sieht das genau so aus, wie ich mir das vorstelle. Danke an alle für die schnelle und vor allem sehr gute Hilfe :toll: :applaus:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
C FileChooser Save-Dialog zeigt Files nicht an AWT, Swing, JavaFX & SWT 3
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
E Swing Dialog modal aufrufen AWT, Swing, JavaFX & SWT 2
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
T JOptionPane Dialog plus Rechnung ausgeben AWT, Swing, JavaFX & SWT 1
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
J JavaFX Dialog - Style AWT, Swing, JavaFX & SWT 6
D Swing Dynamisches Dialog UI AWT, Swing, JavaFX & SWT 8
H JFileChooser Dateinamen vorgeben (Save Dialog) AWT, Swing, JavaFX & SWT 9
D Neues Dialog Mittig auf dem Bildschirm AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
G Datei öffnen Dialog modifizieren AWT, Swing, JavaFX & SWT 13
W SWT Dialog richtig schließen? AWT, Swing, JavaFX & SWT 0
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
TheWhiteShadow SWT Dialog Titel setzen AWT, Swing, JavaFX & SWT 6
VfL_Freak Darstellungsproblem mit Dialog AWT, Swing, JavaFX & SWT 8
P Swing Dialog zeigt keinen Inhalt in Verbindung mit JFrame AWT, Swing, JavaFX & SWT 18
G Nebenläufiger Prozess mit Dialog AWT, Swing, JavaFX & SWT 2
C Swing Fortschrittsanzeige im Dialog ohne Fortschrittsbalken und Abbruchoption AWT, Swing, JavaFX & SWT 7
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
R DnD in modalem Dialog AWT, Swing, JavaFX & SWT 4
I Dialog zum Speichern? AWT, Swing, JavaFX & SWT 16
M Dialog soll etwas an "Oberklasse" übergeben AWT, Swing, JavaFX & SWT 3
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
hdi Swing Bzgl JFrame & modaler Dialog AWT, Swing, JavaFX & SWT 6
N Modaler Dialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 8
J SWT Dialog in Dialog automatisch öffnen AWT, Swing, JavaFX & SWT 19
H Confirm Dialog erweitern AWT, Swing, JavaFX & SWT 5
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
B Gestaltung eines Optionen-Dialog AWT, Swing, JavaFX & SWT 16
P Swing Option zeitbeschränkt in modalem Dialog anbieten AWT, Swing, JavaFX & SWT 2
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
T SWT Window Builder Pro File Dialog anzeigen AWT, Swing, JavaFX & SWT 10
A Swing Delay (1-4 Sek.) bei JTable und Dialog beim ersten Ausführen AWT, Swing, JavaFX & SWT 3
P Swing modaler dialog AWT, Swing, JavaFX & SWT 3
P SWT Dialog AWT, Swing, JavaFX & SWT 3
O Login Dialog zweimal öffnen AWT, Swing, JavaFX & SWT 2
B Datei öffnen Dialog AWT, Swing, JavaFX & SWT 9
N Swing eigenen Dialog erstellen AWT, Swing, JavaFX & SWT 8
C Swing Fehlermeldung in einem Dialog anzeigen AWT, Swing, JavaFX & SWT 2
L Dialog mit Dauerschleifen AWT, Swing, JavaFX & SWT 4
K SWT TableViewer refresh() im Dialog AWT, Swing, JavaFX & SWT 2
Semox Swing FileSaveAs Dialog Problem AWT, Swing, JavaFX & SWT 14
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
B Dialog aus DB Struktur erstellen AWT, Swing, JavaFX & SWT 4
D URL Dialog AWT, Swing, JavaFX & SWT 2
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
J nicht weckklickbarer dialog AWT, Swing, JavaFX & SWT 15
S Frame - Panel - Dialog rückgabe wert AWT, Swing, JavaFX & SWT 5
D Swing Dialog schließen verhindern bei Fehleingabe AWT, Swing, JavaFX & SWT 2
F JColorChooser NICHT im Dialog AWT, Swing, JavaFX & SWT 12
C Swing Mit jTree ein Ordneröffnen Dialog machen? Und Ordner Inhalt auslesen? AWT, Swing, JavaFX & SWT 4
N SWT Dialog mit swt-widgets AWT, Swing, JavaFX & SWT 5
L AWT Daten vom Dialog an Frame senden AWT, Swing, JavaFX & SWT 3
Lurch Swing Dialog erbt von Dialog? AWT, Swing, JavaFX & SWT 28
eQuest Durchsuchen Dialog AWT, Swing, JavaFX & SWT 6
D ausgewählte Textstellen scheinen durch Dialog durch AWT, Swing, JavaFX & SWT 7
S Modalen Dialog nachbauen..? AWT, Swing, JavaFX & SWT 4
E Swing Rückgabe eines Wertes aus einem Dialog zu einem Dialog AWT, Swing, JavaFX & SWT 4
W Swing Problem beim Passwort Dialog AWT, Swing, JavaFX & SWT 4
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
C requestFocus bei modalem Dialog AWT, Swing, JavaFX & SWT 3
5 Mod.Dialog reagiert n.auf ActionListener seiner Komponenten AWT, Swing, JavaFX & SWT 4
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G SWT Dialog AWT, Swing, JavaFX & SWT 7
GilbertGrape EXIT_ON_CLOSE in Dialog AWT, Swing, JavaFX & SWT 3
T JFileChooser: beim Save Dialog einen Dateinamen vorgeben? AWT, Swing, JavaFX & SWT 6
K Druck-Dialog AWT, Swing, JavaFX & SWT 4
D JTable nach Öffnen-Dialog umbaun AWT, Swing, JavaFX & SWT 5
K Dialog schliesst sich nicht. Warum? AWT, Swing, JavaFX & SWT 11
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
J dialog AWT, Swing, JavaFX & SWT 5
H nicht modaler Dialog verdeckt modalen Dialog AWT, Swing, JavaFX & SWT 5
S Probl. bei Java Programm - Dialog zum Bearbeiten von Bildern AWT, Swing, JavaFX & SWT 4
W Wie macht man so nen Settings Dialog AWT, Swing, JavaFX & SWT 2
K Datei öffnen Dialog AWT, Swing, JavaFX & SWT 5
K Dialog aus einem Dialog öffnen AWT, Swing, JavaFX & SWT 4
S preference dialog öffnen AWT, Swing, JavaFX & SWT 8
spacegaier Fehler beim Aufrufen von Dialog aus ActionListener AWT, Swing, JavaFX & SWT 12
B Confirmation Dialog AWT, Swing, JavaFX & SWT 2
T DIALOG für BEENDEN AWT, Swing, JavaFX & SWT 11
N Dialog text bis zum nächsten öffnen sichern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben