# FlowLayout ausrichtung | "Wasserzeichen" im JFrame



## b0unc3 (17. Jun 2006)

Ich habe folgendes problem:

ich will ein JLabel links anzeigen lassen, deshalb füge ich es so ein . . .


```
getContentPane().add(meinJLabel, FlowLayout.LEFT);
```

aber dann wird es mir trotzdem immernoch mittig angezeit, kann mir jemand sagen, warum?


----------



## Timmah (17. Jun 2006)

Was hat denn das ContentPane für ein Layout?

Du solltest evtl. dem JLabel diese Ausrichtung schon mitgeben. Dann sollte das funktionieren.


----------



## b0unc3 (17. Jun 2006)

ContentPane hat das FlowLayout . . 

Das mitgeben geht auch nicht. . hab es jetzt so gemacht:


```
JLabel meinLabel = new JLabel("Text", FlowLayout.LEFT);
```

aber steht miemrnoch mittig

//EDIT:

achja das layout hab ich im kopf so festgelegt

getContentPane().setLayout( new FlowLayout());


----------



## Ralf Ueberfuhr (18. Jun 2006)

Der Parameter im Konstruktor von JLabel sollte SwingConstants.LEFT sein und bedeutet die innere Ausrichtung im JLabel selbst. Das sagt nichts über die Ausrichtung auf dem ContentPane.


```
getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
```


----------



## b0unc3 (18. Jun 2006)

ah okay, thx . .hab das Problem jetzt anders gelöst. Ich habe ein "null" Layout genommen und hab das jetzt alles da hin gesetzt, wo es hinsoll xD . . Aber ich hab mal ne andere Frage:

Kann ich in einem JFrame eine Art Wasserzeichen im Hintergrund einfügen?


----------



## André Uhres (18. Jun 2006)

b0unc3 hat gesagt.:
			
		

> ..Kann ich in einem JFrame eine Art Wasserzeichen im Hintergrund einfügen?




```
//package paint;
/*
 * WatermarkSimulator.java
 * [url]http://today.java.net/pub/a/today/2005/07/12/visualizations.html?page=2[/url]
 */
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class WatermarkSimulator {
    public static void main(String[] args) {
        BufferedImage image = null;
        JFrame frame = new JFrame("WatermarkSimulator");
        frame.setSize(new Dimension(510, 450));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setLayout(new GridBagLayout());
        frame.getContentPane().add(new JButton("Hello"));
        JWatermark.createWatermark(frame, "Development");
        frame.setVisible(true);
    }
}
class JWatermark extends JComponent{
    private static final float OPACITY = 0.15f;
    private static final double ROTATION = -(Math.PI / 4);
    private Font font = UIManager.getFont("Label.font");
    private String text = "";
    public static Integer WATER_MARK_LAYER
            = new Integer(JLayeredPane.FRAME_CONTENT_LAYER.intValue()
            + 1);
    public JWatermark(String text) {
        this.text = text;
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Window window = SwingUtilities.getWindowAncestor(this);
        Rectangle viewRect = window.getBounds();
        int halfWidth = viewRect.width / 2;
        int halfHeight = viewRect.height / 2;
        Graphics2D graphics2D = (Graphics2D) g;
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, OPACITY);
        graphics2D.setComposite(ac);
        final int minSide = Math.min(viewRect.width, viewRect.height);
        font = font.deriveFont((float)( minSide / 7));
        graphics2D.setFont(font);
        Rectangle textRect = new Rectangle();
        graphics2D.setFont(font);
        graphics2D.rotate(ROTATION, halfWidth, halfHeight);
        SwingUtilities.layoutCompoundLabel(this,
                graphics2D.getFontMetrics(), text, null,
                SwingConstants.CENTER, SwingConstants.CENTER,
                SwingConstants.CENTER, SwingConstants.CENTER,
                viewRect, new Rectangle(), textRect,
                0);
        graphics2D.setColor(getForeground());
        int string_x = halfWidth - (int) (textRect.width / 2);
        int y = halfHeight + textRect.height / 7;
        graphics2D.drawString(text, string_x, y);
    }
    public static void createWatermark(JFrame frame, String text){
        JWatermark watermark = new JWatermark(text);
        watermark.setOpaque(false);
        Dimension screenSize =
                Toolkit.getDefaultToolkit().getScreenSize();
        watermark.setBounds(0, 0,
                (int)screenSize.getWidth(),
                (int)screenSize.getHeight());
        watermark.setVisible(true);
        watermark.setForeground( Color.BLUE );
        final JLayeredPane jLayeredPane = frame.getLayeredPane();
        jLayeredPane.add(watermark, WATER_MARK_LAYER, 0);
    }
}
```


----------



## b0unc3 (18. Jun 2006)

danke für die hilfe xD hab auch gleich noch ne frage. . kann ich in einem Frame, nachdem ich mit JTextField.setText("Der Text");
dem JFrame sagen, er soll erst warten, bis ein Button geklickt wurde, bevor er den rest des Codes Abarbeitet?


----------



## André Uhres (18. Jun 2006)

Du machst einfach den Rest des Codes beim Buttonklick.


----------



## b0unc3 (18. Jun 2006)

ok das Problem wäre gelöst. jetzt hab ich aber schon wieder ein neues, was ich nicht verstehe:

Bei einem Buttonklick soll er mir in einem Textfeld eine Frage ausgeben und einen Integer um 1 erhöhen. Die Fragen liegen in einem Mehrdimensionalem Array. 

Wenn ich das erste mal auf den Button klicke, dann gibt er mir Die Frage aus und erhöht den Integer um 1. Wenn ich aber dann nochmal darauf klicke, gibt er mir die selbe frage aus, erhöht aber den Integer nicht mehr.

Kann mir jemand sagen, woran das liegen könnte und wie ich dieses Problem beheben könnte?

Hier mal ein BeispielCode ( aus der Luft gegriffen ) :


```
/**
 *Inhalte des JFrames erzeugen
 *ActionCommands zuweisen
 *ActionListener hinzufügen
 */
.
.
.
public void actionPerformed ( ActionEvent evt ) {

   int fragenNummer = 0;

    if ( evt.getActionCommand().equals("Nächste Frage")  )
    {
        meinJTextField.setText(fragen[fragenNummer][0]);
        fragenNummer++;
    }
}
```

//EDIT:

okay ich habe jetzt herausgefunden, dass er den Integer fragenNummer immer auf 0 zurück setzt. Aber ich weiß immernoch nicht, wie ich den COde ändern muss, dass es klappt.

//EDIT2:
okay ich habs jetzt geschafft. . mein Fehler war, dass ich den Integer in der actionPerformed Methode deklariert hab. Jetzt hab ich ihn an den Kopf des Programmes gesetzt ;-)


----------

