Bildschirmaufbau fehlerhaft

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ihr seid wohl die letze Rettung, ich habe folgendes Problem :

JAVA APPLET

Ein Menü welches über 3 Buttons verfügt :
- AD
- STATUS
- RTC

Wenn ich AD drücke dann baut er eine Tabelle auf ( aus Rechtecken) und zeichnet auch schön alle Labels.
Sobald ich auf RTC drücke löscht er die ebend gezeichneten.
Sobald ich aber erst auf AD dann auf STATUS drücke löscht er die Tabelle aber die neugezeichneten Rechtecke
werden falsch dargestellt. Es fehlt zb ein Stück eines Rechtecks.
Wenn ich die Reihenfolge AD dann RTC dann STATUS drücke geht alles, wo ist mein Denkfehler???

Ich hoffe der kleine Codeausschnitt hilft weiter, wollte nicht den ganzen Code posten da dies zuviel wäre, bei bedarf schicke ich ihn aber per Mail zu. Die Ansteuerung der Menübuttons funktioniert und er springt auch in die Actionlistener-Routine.


Code:
// Darstellung des AD-Screens

public void screen_ad_wandlung()
{
  Graphics g = getGraphics();

   // Text "Kanal"
   Kanal_text.setText("Kanal");
   Kanal_text.setAlignment(Label.LEFT);
   Kanal_text.setBackground(new Color(216,228,248));
   Kanal_text.setForeground(Color.black);
   Kanal_text.setFont(new Font("Dialog", Font.BOLD, 16));
   Kanal_text.setBounds(35,145+60,155,35);
   add(Kanal_text);
  // mehere solcher Labels gibt es noch

   g.drawRect(49-20,139+60,166,46); //Kanal
  // mehrere socher Rechtecke gibt es noch 
}

// AD-Screen löschen

public void screen_ad_wandlung_clear()
{
  Graphics g = getGraphics();
 
  g.setColor(Color.white);
  g.drawRect(49-20,139+60,166,46); //Kanal
  remove(Kanal_text);
}

// Status-Screen aufbauen

void screen_status()
{

  Graphics g = getGraphics();
 
   g.setColor(Color.black);
   g.drawRect(49+390,139+60,166,46); //Kanal
   
    // Text "Kanal"
   Status_status.setText("Status");
   Status_status.setAlignment(Label.LEFT);
   Status_status.setBackground(new Color(216,228,248));
   Status_status.setForeground(Color.black);
   Status_status.setFont(new Font("Dialog", Font.BOLD, 16));
   Status_status.setBounds(35,145+60,155,35);
   add(Status_status);
}

// Button gedrückt auswerten

public void actionPerformed(ActionEvent event)
 {
    
   if (event.getSource()==button_menu_st) 
   {
     screen_ad_wandlung_clear();
     screen_status();
    }  
  if (event.getSource()==button_menu_ad) 
  {
   screen_ad_wandlung();
  }
  if (event.getSource()==button_menu_rtc) 
  {
   screen_ad_wandlung_clear();
  }
 }

Danke, Chris (der nach 4 Std nichtmehr weiterweiss)
 

Wildcard

Top Contributor
Du zeichnest falsch. In Java zeichnest du nur in der paint bzw. paintComponent Methode.
getGraphics streichst du am besten komplett aus deinem Gedächtnis.

Notiz an mich selbst: FAQ Eintrag dazu schreiben. Immer das gleiche Problem :?
 
G

Guest

Gast
Danke für den Tip. Leider war es nicht des Rätsels Lösung.
Hab jetzt alles in die paint-Methode geschoben und ein if-abfrage reingesetzt.
In paint steht sowas wie :

Code:
if (test==1)
// jetzt kommen zeichenroutinen
test=0;

Und bei den Actionlistenern steht

Code:
if (event.getSource()==button_menu_st) 
   { 
     test=1;
     repaint(); 
    }


Das funktioniert genauso wie vorher :cry:
Aber ein Denkfehler mache ich doch nicht wenn ich mit add(label) ein Label zeichnen lasse und
mit remove(label) es entferne. (Ja ich weiß das dies heißt es in einen Container zu legen).
Durch repaint wird ja wieder die paint-Methode aufgerufen und er springt in meine if-Anweisung.
Dies funktioniert aber nur bis zu dem Punkt richtig bis ich einmal mit remove und den weißen rechtecken
das bild gelöscht habe, sobal dann wieder mit add neue Labels in Bild sollen und neue Rechtecke
geht es nicht.

Chris
 

Wildcard

Top Contributor
Immer wenn du Komponenten hinzufügst/entfernst musst du anschließend validate auf dem Container aufrufen.
 
G

Guest

Gast
OT : Mir fällt gerade nur ein "Kannst Du auch nicht schlafen" :D

Leider immer noch nix, kann ich Dir den ganzen Code mal per Mail schicken????

Chris
 
G

Guest

Gast
Code:
public void actionPerformed(ActionEvent event)
 {
    
  if (event.getSource()==button_menu_st)  
  {
     if (in_st==false) 
     {  
       test=2;                                 // Löschroutine für Menü AD
       repaint();
       // test=3;repaint();
      }
   }
  
  if (event.getSource()==button_menu_ad)      // Menü AD wird dargestellt 
  {
   if (in_ad == false) test=1;
   repaint();
  }
  
  if (event.getSource()==button_menu_dio)   // Menü ST wird dargestellt
  {
    test=3;
    repaint();
   }

Was ich nicht verstehe ist wenn "button_menu_ad" aufgerufen wird und danach "button_menu_st" und danach "button_menu_dio" klappt alles.
Sobald ich aber die auskommentierte Zeile "test=3;repaint();" im event "button_menu_st" auskommentiere dann geht es nichtmehr. Was macht es für ein Unterschied? Es liegt nur ein Mausknopfdruck dazwischen.

Chris
 

Wildcard

Top Contributor
Was macht das 'test' überhaupt?
Tut mir leid, ist schon spät, ich seh einfach nicht was der Code machen soll ???:L
Wenn's nicht gerade 300 Zeilen sind poste das Ding mal komplett hier rein.
 
G

Guest

Gast
Code:
import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.awt.event.*;

public class GUI extends JApplet
implements ActionListener
{
   int test=0;

    // Label und Button definieren
     Button button_menu_ad = new Button("A/D-Wandler");
     Button button_menu_st = new Button("Status");
     Label Kanal_text = new Label();
     Label hexadezimal = new Label();
     Label dezimal = new Label();
     Label spannung = new Label();
     Label Status_status = new Label();
     Label Status_ip = new Label();
     Label Status_port = new Label();
    
     public void init()
    {   
     setLayout(null);    // kein Layout festlegen
    }

    public void start()   // Menü zeichnen
    {
      button_menu_st.setBounds(14,122,120,20);
    button_menu_st.setFont(new Font("Arial",Font.BOLD,15));
    if (isConnected== false)
     button_menu_st.setBackground(Color.red);
     else button_menu_st.setBackground(Color.green);
    add(button_menu_st); 
    button_menu_ad.setBounds(135,122,120,20);
    button_menu_ad.setFont(new Font("Arial",Font.BOLD,15));
    button_menu_ad.setBackground(new Color(216,228,248));
    add(button_menu_ad); 

    // ActionListener
   button_menu_st.addActionListener(this);
   button_menu_ad.addActionListener(this);
    }

    public void stop()
    {
    }

    public void paint(Graphics g)
    {
    g.drawRect(10,120,970,23); //Menürahmen
 
    if (test==1)  // AD-Wandlerscreen zeichnen
    {
   Kanal_text.setText("Kanal");
   Kanal_text.setAlignment(Label.LEFT);
   Kanal_text.setBackground(new Color(216,228,248));
   Kanal_text.setForeground(Color.black);
   Kanal_text.setFont(new Font("Dialog", Font.BOLD, 16));
   Kanal_text.setBounds(35,145+60,155,35);
   add(Kanal_text);validate();
   hexadezimal.setText("Hexadezimal");
   hexadezimal.setAlignment(Label.LEFT);
   hexadezimal.setForeground(Color.black);
   hexadezimal.setBackground(new Color(216,228,248));
   hexadezimal.setFont(new Font("Dialog", Font.BOLD, 16));
   hexadezimal.setBounds(35,191+60,155,35);
   add(hexadezimal);validate();
   dezimal.setText("Dezimal");
   dezimal.setAlignment(Label.LEFT);
   dezimal.setForeground(Color.black);
   dezimal.setBackground(new Color(216,228,248));
   dezimal.setFont(new Font("Dialog", Font.BOLD, 16));
   dezimal.setBounds(35,237+60,155,35);
   add(dezimal);validate();
   spannung.setText("Spannung");
   spannung.setAlignment(Label.LEFT);
   spannung.setForeground(Color.black);
   spannung.setBackground(new Color(216,228,248));
   spannung.setFont(new Font("Dialog", Font.BOLD, 16));
   spannung.setBounds(35,283+60,155,35);
   add(spannung);validate();
   g.setColor(Color.black);
  // Rechtecke
    g.drawRect(49-20,139+60,166,46); //Kanal
    g.drawRect(49-20,185+60,166,46); // Hexa
    g.drawRect(49-20,231+60,166,46); // Dezimal
    g.drawRect(49-20,277+60,166,46); // Spannung
     test=0;
  }   
 
if (test==2) // LÖSCHUNG DER AD-Zeichnung!
{
  g.setColor(Color.white);
  // Rechtecke
    g.drawRect(49-20,139+60,166,46); //Kanal
    g.drawRect(49-20,185+60,166,46); // Hexa
    g.drawRect(49-20,231+60,166,46); // Dezimal
    g.drawRect(49-20,277+60,166,46); // Spannung
    remove(Kanal_text);validate();
   remove(hexadezimal); validate();
   remove(dezimal); validate();
   remove(spannung); validate();
   test=0;
}

if (test==3)  // STATUS AUFBAU
{
    g.setColor(Color.black);
    g.drawRect(49-20,139+60,166,46); //Kanal
    g.drawRect(49-20,185+60,166,46); // Hexa
    g.drawRect(49-20,231+60,166,46); // Dezimal
   Status_status.setText("Status");
   Status_status.setAlignment(Label.LEFT);
   Status_status.setBackground(new Color(216,228,248));
   Status_status.setForeground(Color.black);
   Status_status.setFont(new Font("Dialog", Font.BOLD, 16));
   Status_status.setBounds(35,145+60,155,35);
   add(Status_status);validate();
   Status_ip.setText("IP-Adresse");
   Status_ip.setAlignment(Label.LEFT);
   Status_ip.setForeground(Color.black);
   Status_ip.setBackground(new Color(216,228,248));
   Status_ip.setFont(new Font("Dialog", Font.BOLD, 16));
   Status_ip.setBounds(35,191+60,155,35);
   add(Status_ip);validate();
   Status_port.setText("Port");
   Status_port.setAlignment(Label.LEFT);
   Status_port.setForeground(Color.black);
   Status_port.setBackground(new Color(216,228,248));
   Status_port.setFont(new Font("Dialog", Font.BOLD, 16));
   Status_port.setBounds(35,237+60,155,35);
   add(Status_port);
   validate();
   test=0;
}}
  
    public void destroy()
    {}

    public String getAppletInfo()
    {}

public void actionPerformed(ActionEvent event)
 {
    
  if (event.getSource()==button_menu_st) 
  {
     test=2;
     repaint();
     // test=3;                    // mit dieser auskommentierung wird STATUS nicht
     // repaint();                // neu gezeichnet! Sobald ich diese wegnehme geht es nicht mehr!
   }
   
  if (event.getSource()==button_menu_ad) 
  {
  test=1;
   repaint();
  }
}
}

So das Problem ist jetzt so klein wie Möglich gemacht. Das soll folgendes tun.
Ich drücke auf "AD-Wandler" und er zeigt mir ein paar Labels und Rechtecke. Drücke ich auf
"Status" soll er den Screen löschen und ANDERE Labes und Rechtecke zeichnen.
Das löschen macht er noch, sobald ich aber den Code einsetze zum neuzeichnen macht er nichts mehr.
Meine Frage was mache ich hier falsch?

VARIABELN :
test - zum erkennen was in paint ausgeführt werden soll.
test = 1 baue AD Bildschirm auf
test = 2 dann lösche Bildschirm
test = 3 baue Status Bildschirm auf

DANKE!!!
 

Wildcard

Top Contributor
In der paint Methode wird wirklich nur gezeichnet. Logik hat darin nichts zu suchen. Insbesondere darfst du in der paint keinen Einfluss auf die GUI Elemente nehmen, da dadurch paint Events getriggert werden und das ganze plötzlich rekursiv wird. Insbesondere bei deinem Code ist der Programmverlauf dann kaum noch nachzuvollziehen.
 
G

Guest

Gast
Das mit dem Rekursiven Aufruf leuchtet ein, aber wie verhinder ich das?

Ich habe 2 Buttons, 1 und 2, wenn ich auf 1 drücke stelle Label1 da wenn ich auf 2 drücke
lösche das Fenster und stelle Label2 da.
Wie geht soetwas?

Gruß Chris
 
G

Guest

Gast
Ich bin zu blöd. Habe hier schon die Suche benutzt und komme einfach nicht weiter. Ich hasse es, warscheinlich seh ich den Wald vor lauter Bäumen nicht.

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import javax.swing.*; 

public class test extends JApplet
implements ActionListener

{
    Panel  panel1 = new Panel();
    Panel  panel2 = new Panel();

    Button button1 = new Button("1");
    Button button2 = new Button("2");
    
    CardLayout cc = new CardLayout();

    public void init()
    {
     setLayout(cc);

    panel1.add(button1);
    panel2.add(button2);
    button1.addActionListener(this);
   
    add("test",panel1);
    add("test2",panel2);
   }


 public void start()
 {  
 } 

public void stop()
{
}

public void paint(Graphics g)
{
}

public void destroy()
{
}


public void actionPerformed(ActionEvent event)
 {
    
  if (event.getSource()==button1) // Wenn Button1 gedrückt, zeige panel test2 an!
  {
     cc.show(panel2,"test2");
  }
 }
   
}

Er zeigt mir hier zwar den Button1 an aber wenn ich ihn drücke wechselt er nicht nach panel2!
 
G

Guest

Gast
Wald gefunden :cool:

Danke Dir Wildcard für Deine unermütliche Hilfe.......vorallem auch schnelle :!:

Chris
....der das "Handbuch der Java-Programmierung" noch nicht auswendig kann
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben