Severin: Code Vereinfachung

Hallo

Ich habe diesen Code in einer, sagen wir, MainClass:

public static void main(String[] args)
{
   DesktopFrame desktop = new DesktopFrame("Adressen");
   desktop.setSize(800,600);
   desktop.setLocation(100,100);
   desktop.desk.setBackground(Color.WHITE);
}

Die Klasse DesktopFrame sieht etwa so aus:

public class DesktopFrame extends JFrame
{
  public JDesktopPane desk;
  public DesktopFrame(String strTitle)
  {
     super(strTitle);
  this.desk = new JDesktopPane();
  this.desk.setDesktopManager(new DefaultDesktopManager());
  setContentPane(desk);
  addWindowListener(new WindowClosingAdapter());
  }
   }

Nun habe ich in der MainClass den Aufruf

desktop.desk.setBackground(Color.WHITE);

und dabei stört mich irgendwie dieses "desktop.desk". Ist es nicht irgendwie möglich das ganze so umzustellen, dass ich die Hintergrundfarbe auch mit

desktop.setBackground(Color.WHITE);

setzen kann?

Danke einmal im Voraus für die Hilfe

Severin

  1. Ich will ja nicht frech werden, aber was ist an einem Wort mehr so schlimm?

    1. Hallo

      Ich will ja nicht frech werden, aber was ist an einem Wort mehr so schlimm?

      ...schlimm ist's nicht, stören tut's mich trotzdem und wenns eine einfache Lösung gibt...warum nicht?

      Gruss Severin

  2. Hi,

    ja, ich denke das kann man "vereinfachen", also nennen wir es eigentlich mal nur etwas besser kapseln:

    public class DesktopFrame extends JFrame
    {

    Das geht auch private - wenn's keiner public braucht - Information-Hiding!
    private JDesktopPane desk;

    public DesktopFrame(String strTitle)
      {
         super(strTitle);
      this.desk = new JDesktopPane();
      this.desk.setDesktopManager(new DefaultDesktopManager());
      setContentPane(desk);
      addWindowListener(new WindowClosingAdapter());
      }
       }

    Nun fügen wir einfach diese Klasse noch eine Method hinzu:
    public void setBackground(...) {
       this.desk.setBackground(...);
    }

    Nun habe ich in der MainClass den Aufruf

    desktop.desk.setBackground(Color.WHITE);

    und dabei stört mich irgendwie dieses "desktop.desk". Ist es nicht irgendwie möglich das ganze so umzustellen, dass ich die Hintergrundfarbe auch mit

    desktop.setBackground(Color.WHITE);

    Und dann^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    Ist also nichts anderes als ein durchreichen, ist vielleicht nicht eleganter aber meiner Meinung nach mehr dem Klassenverständnis gemäß: Was interessiert es/was geht es die Mainklasse an, das desktop ein Unterobjekt desk hat?

    MfG
    Rouven

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hallo!

      Vorerst einmal: Danke. Nun habe ich das so gemacht

      MainClass:

      public class TestClass

      {
       public static void main(String[] args)
       {
        DesktopFrame desktop = new DesktopFrame("Titel");
        desktop.setSize(800,600);
        desktop.setLocation(100,100);
        desktop.setBackground(Color.WHITE);
        desktop.setVisible(true);
       }
       }

      DesktopFrame:

      public class DesktopFrame extends JFrame
       {
        private JDesktopPane desk;

      public DesktopFrame(String strTitle)
        {
         super(strTitle);
         this.desk = new JDesktopPane();
         this.desk.setDesktopManager(new DefaultDesktopManager());
         setContentPane(desk);
         addWindowListener(new WindowClosingAdapter());
        }

      public DesktopFrame()
        {
         this("Titel");
        }

      public void setBackground(Color color) {
           this.desk.setBackground(color);
       }

      Ergibt aber immer eine NullPointerException auf der Linie
      this.desk.setBackground(color);

      Gruss Severin

      1. Hallo,

        das tut mir Leid, ich weiß nicht auf Anhieb wo das Problem liegt...

        public void setBackground(Color color) {

        Mach hier mal bitte eine Ausgabe hin:
        System.out.println(color);
        Ansonsten kannst du noch eine Überprüfung machen (nur zum Testen, um dem Fehler näher zu kommen);
        if (this == null) System.out.println("Komisch, this ist null");
        if (this.desk == null) System.out.println("desk ist null");

        this.desk.setBackground(color);
         }

        Und schließlich: Lass mal testhalber das this weg, vielleicht klappts dann...:
        desk.setBackground(color);

        MfG
        Rouven

        --

        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. Hallo

          Es klappt sobald ich schreibe

          public void setBackground1(Color col)
          {
            this.desk.setBackground(col);

          }

          und aufrufe mit setBackground1(Color.WHITE);

          Es scheint als könnte ich diese setBackground-Methode nicht überschreiben...

          1. und wenn ich die Überprüfung mache...desk ist null! Aber warum?

            1. und wenn ich die Überprüfung mache...desk ist null! Aber warum?

              Tja, das ist eine gute Frage. Läuft es denn, wenn du die Methode anders benennst, oder ist es dann NULL und wirft die selbe Exception? An die Sache mit der überschreiben einer internen Funktion habe ich jetzt gerade gar nicht gedacht - in letzter Zeit wenig mit Java gemacht.

              MfG
              Rouven

              --

              -------------------
              ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
              1. Könnte es nicht sein, dass hier eine Rekursion entsteht?

          2. Guude!

            Es klappt sobald ich schreibe

            public void setBackground1(Color col)
            {
              this.desk.setBackground(col);

            }

            und aufrufe mit setBackground1(Color.WHITE);

            Es scheint als könnte ich diese setBackground-Methode nicht überschreiben...

            Doch, das hast Du ja getan und genau das ist das Problem ;-)

            In der Klasse javax.swing.JFrame wird bei der Instanzierung eines JFrames die Methode "setBackground()" aufgerufen. Zu diesem Zeitpunkt existiert Dein desk-Objekt noch nicht und wirft die NullPointerException auf. Also: Methode umbenennen in bspw. "setDeskBackground()".

            LG ausm Hesseland
            Lemmy

            --
            Wer seiner Frau gegenüber stets beteuert, dass DAS tatsächlich 30cm sind, darf sich nicht wundern, wenn sie nicht richtig einparken kann...