Hintergrundbild in eine GUI einfügen (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K (L-ectron-X verschob die Seite Hintergrundbild in einem Fenster einfügen (Java) nach Hintergrundbild in eine GUI einfügen (Java), ohne dabei eine Weiterleitung anzulegen)
K
Zeile 2: Zeile 2:
 
Standard-GUIs sind langweilig? Zur Illustration kann man Swing-GUIs in Java relativ einfach mit einem Hintergrundbild versehen.
 
Standard-GUIs sind langweilig? Zur Illustration kann man Swing-GUIs in Java relativ einfach mit einem Hintergrundbild versehen.
  
Folgende [[Klasse]] erbt von {{JAPI|JPanel}} und kann daher relativ flexibel in einer [[GUI]] eingesetzt werden.
+
Folgende [[Klasse]] erbt von {{JAPI|JPanel}} und kann daher relativ flexibel in einer [[GUI]] eingesetzt werden. Sie ist in der Lage ein Hintergrundbild zu empfangen und dieses nach bestimmten Kriterien zu zeichnen.
 +
 
 +
Man kann bspw. bestimmen, ob das Hintergrundbild immer an die aktuellen Dimensionen des einbettenden Panels angepasst werden soll. Damit wäre sichergestellt, dass das gesamte Bild jederzeit sichtbar ist. Allerdings hat das auch einen Nebeneffekt. Es kann passieren, dass das Bild verzerrt dargestellt wird, was insbesondere bei Fotos störend sein kann.
 +
 
 +
Man kann allerdings auch festlegen, dass das Bild nicht verzerrt werden darf. Dann wird je nach Dimension des JPanels ggf. nur ein Teil des gesamten Bildes dargestellt.
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
  class BackgroundImagePanel extends JPanel {
+
class BackgroundImagePanel extends JPanel {
      private Image image;
+
  private Image image;
      private boolean fitImage;
+
  private boolean fitImage;
  
      /**
+
  /**
      * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
+
    * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
      */
+
    */
      BackgroundImagePanel() {
+
  BackgroundImagePanel() {
        super();
+
      super();
      }
+
  }
  
      /**
+
  /**
      * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
+
    * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
      *
+
    *
      * @param layout ein LayoutManager zur Anordnung von GUI-Komponenten für das Panel.
+
    * @param layout ein LayoutManager zur Anordnung von GUI-Komponenten für das Panel.
      */
+
    */
      BackgroundImagePanel(LayoutManager layout) {
+
  BackgroundImagePanel(LayoutManager layout) {
        super(layout);
+
      super(layout);
      }
+
  }
  
      /**
+
  /**
      * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
+
    * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
      * und in den Original-Dimensionen ausgeben werden.
+
    * und in den Original-Dimensionen ausgeben werden.
      *
+
    *
      * @param image das zu zeichnende Bild
+
    * @param image das zu zeichnende Bild
      */
+
    */
      void setImage(Image image) {
+
  void setImage(Image image) {
        this.setImage(image, false);
+
      this.setImage(image, false);
      }
+
  }
  
      /**
+
  /**
      * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
+
    * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
      * und und in den Original-Dimensionen oder in Format und Dimension des Panels ausgeben werden.
+
    * und und in den Original-Dimensionen <b>oder in Format und Dimension des Panels ausgeben werden.</b>
      *
+
    *
      * @param image das zu zeichnende Bild
+
    * @param image das zu zeichnende Bild
      * @param fitImage bei Übergabe von true wird das Bild immer an die Größe des Panel angepasst (kann zu Verzerrung führen),
+
    * @param fitImage bei Übergabe von true wird das Bild immer an die Größe des Panel angepasst (kann zu Verzerrung führen),
      * ansonsten wird immer das Original gezeichnet.
+
    * ansonsten wird immer das Original gezeichnet.
      */
+
    */
      void setImage(Image image, boolean fitImage) {
+
  void setImage(Image image, boolean fitImage) {
        this.image = image;
+
      this.image = image;
        this.fitImage = fitImage;
+
      this.fitImage = fitImage;
        validate();
+
      validate();
        repaint();
+
      repaint();
      }
+
  }
 
 
      /**
 
      * @see javax.swing.JComponent#getPreferredSize()
 
      */
 
      @Override
 
      public Dimension getPreferredSize() {
 
        if(image != null) {
 
            System.out.println(this.getSize());
 
            return new Dimension(image.getWidth(this), image.getHeight(this));
 
        }
 
  
         return super.getPreferredSize();
+
  /**
 +
    * @see javax.swing.JComponent#getPreferredSize()
 +
    */
 +
  @Override
 +
  public Dimension getPreferredSize() {
 +
      if(image != null) {
 +
        System.out.println(this.getSize());
 +
         return new Dimension(image.getWidth(this), image.getHeight(this));
 
       }
 
       }
 +
      return super.getPreferredSize();
 +
  }
  
      /**
+
  /**
      * @see javax.swing.JComponent#paintComponent(Graphics g)
+
    * @see javax.swing.JComponent#paintComponent(Graphics g)
      */
+
    */
      @Override
+
  @Override
      protected void paintComponent(Graphics g) {
+
  protected void paintComponent(Graphics g) {
        super.paintComponent(g);
+
      super.paintComponent(g);
        if(image != null) {
+
      if(image != null) {
            if(fitImage) {
+
        if(fitImage) {
              Dimension size = this.getSize();
+
            Dimension size = this.getSize();
              g.drawImage(image, 0, 0, size.width, size.height, this);
+
            g.drawImage(image, 0, 0, size.width, size.height, this);
            } else {
+
        } else {
              g.drawImage(image, 0, 0, this);
+
            g.drawImage(image, 0, 0, this);
            }
 
 
         }
 
         }
 
       }
 
       }
 
   }
 
   }
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Version vom 16. Juni 2018, 18:17 Uhr

Standard-GUIs sind langweilig? Zur Illustration kann man Swing-GUIs in Java relativ einfach mit einem Hintergrundbild versehen.

Folgende Klasse erbt von JPanel und kann daher relativ flexibel in einer GUI eingesetzt werden. Sie ist in der Lage ein Hintergrundbild zu empfangen und dieses nach bestimmten Kriterien zu zeichnen.

Man kann bspw. bestimmen, ob das Hintergrundbild immer an die aktuellen Dimensionen des einbettenden Panels angepasst werden soll. Damit wäre sichergestellt, dass das gesamte Bild jederzeit sichtbar ist. Allerdings hat das auch einen Nebeneffekt. Es kann passieren, dass das Bild verzerrt dargestellt wird, was insbesondere bei Fotos störend sein kann.

Man kann allerdings auch festlegen, dass das Bild nicht verzerrt werden darf. Dann wird je nach Dimension des JPanels ggf. nur ein Teil des gesamten Bildes dargestellt.

class BackgroundImagePanel extends JPanel {
   private Image image;
   private boolean fitImage;

   /**
    * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
    */
   BackgroundImagePanel() {
      super();
   }

   /**
    * Erzeugt ein BackgroundImagePanel, das sich zunächst wie ein "normales" JPanel verhält.
    *
    * @param layout ein LayoutManager zur Anordnung von GUI-Komponenten für das Panel.
    */
   BackgroundImagePanel(LayoutManager layout) {
      super(layout);
   }

   /**
    * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
    * und in den Original-Dimensionen ausgeben werden.
    *
    * @param image das zu zeichnende Bild
    */
   void setImage(Image image) {
      this.setImage(image, false);
   }

   /**
    * Nimmt das zu zeichnende Bild entgegen und nimmt Einstellungen vor, die das Hintergrundbild im Originalformat
    * und und in den Original-Dimensionen <b>oder in Format und Dimension des Panels ausgeben werden.</b>
    *
    * @param image das zu zeichnende Bild
    * @param fitImage bei Übergabe von true wird das Bild immer an die Größe des Panel angepasst (kann zu Verzerrung führen),
    * ansonsten wird immer das Original gezeichnet.
    */
   void setImage(Image image, boolean fitImage) {
      this.image = image;
      this.fitImage = fitImage;
      validate();
      repaint();
   }

   /**
    * @see javax.swing.JComponent#getPreferredSize()
    */
   @Override
   public Dimension getPreferredSize() {
      if(image != null) {
         System.out.println(this.getSize());
         return new Dimension(image.getWidth(this), image.getHeight(this));
      }
      return super.getPreferredSize();
   }

   /**
    * @see javax.swing.JComponent#paintComponent(Graphics g)
    */
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if(image != null) {
         if(fitImage) {
            Dimension size = this.getSize();
            g.drawImage(image, 0, 0, size.width, size.height, this);
         } else {
            g.drawImage(image, 0, 0, this);
         }
      }
   }
}