JLabel text zentrieren?

2 Antworten

Das, was du da versuchst, kann nicht funktionieren, weil du explizit sagst, dass du auf ein Layout verzichtest. Meine Antwort unterscheidet sich daher nicht sonderlich von denen zu deinen vorherigen Fragen. Vergiss setBounds und nutze Layout Manger.

Hier ein Beispiel für einen Button mit Bild, Rahmen und Text. Text und Button sind jeweils im Fenster zentriert.

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class Example extends JFrame {
  
  public Example() {
    super("Example");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridBagLayout());

    JButton imageButton = new JButton("Hello!", new ImageIcon("flowers.jpg"));
    imageButton.setForeground(Color.WHITE);
    imageButton.setFont(new Font("Comic Sans MS", Font.BOLD, 12));    
    imageButton.setHorizontalTextPosition(JButton.CENTER);
    imageButton.setVerticalTextPosition(JButton.CENTER);
    imageButton.setBorder(new LineBorder(Color.YELLOW, 3));

    add(imageButton, new GridBagConstraints());

    setSize(300, 300);
    setVisible(true);
  }
}

// Main:
public static void main(String[] args) {
  SwingUtilities.invokeLater(() -> new Example());
}

Für Interessierte verlinke ich nochmal auf meine ältere Antwort, da bei deinem Code all die Punkte zutreffen, die ich schon einmal erwähnt habe. Des Weiteren solltest du Umlaute/Sonderzeichen in Bezeichnernamen vermeiden, da dies Encoding-Probleme verursachen kann.

Übrigens liefert dein Code auch die Information mit, die bei deiner letzten Frage noch offen war: Du verwendest ein eigenes Look & Feel. Daher hast du auch Probleme, den Button normal rot zu färben.

Um also zu verhindern, dass das L&F auf den Button wirkt, wären diese Schritte durchzuführen:

// prevent l&f painting
imageButton.setContentAreaFilled(false);
// set opaque, because it will be set to false in step before
imageButton.setOpaque(true);
// set background color
imageButton.setBackground(Color.RED);

Eine andere Lösung hast du ansonsten schon selbst benannt: Eine eigene Button-Klasse.


Huhngut 
Beitragsersteller
 22.03.2019, 15:55

ok ich werde die ganzen klassen umschreiben zu diesem code könntest du mir das was in der main ist erleutern

0
regex9  22.03.2019, 17:35
@Huhngut

In der main-Methode veranlasse ich, dass der JFrame auf dem Dispatch Event Thread ausgeführt wird. Lies dazu hier und hier.

Dies:

() -> new Example()

ist des Weiteren ein Lambda-Ausdruck. Man könnte es auch so schreiben:

SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    new Example();
  }
});

doch seit Java 8 kann man diesen Boilerplate-Code auch weglassen, da das Interface nur eine einzige Methode fordert. Es ist also klar, welche Methode der Lambda definiert.

0
Huhngut 
Beitragsersteller
 22.03.2019, 16:02

wie schaffe ich es die knöpfe an eine bestimmte position zu setzen ich werde auuch mal googlen

0
regex9  22.03.2019, 17:36
@Huhngut

Entweder du unterteilst die Oberfläche weiter mit dem GridBagLayout oder du nutzt andere Layout Manager - schachtelst sie möglicherweise. Viel suchen musst du dafür nicht. Oracle stellt sie alle hier vor.

0

Ps: knopf1_text.setHorizontalAlignment(JLabel.CENTER);

bei dem verschwindet der Text ganz


Huhngut 
Beitragsersteller
 20.03.2019, 16:58

SwingConstants.CENTER geht auch nicht

0
Huhngut 
Beitragsersteller
 20.03.2019, 17:12

selbst so funktioniert es nicht

public static void LabelZentriert() {

JFrame frame = new JFrame();

JButton button = new JButton();

frame.setLayout(null);

button.add(createLabel());

button.setBounds(100, 100, 100, 100);

frame.add(button);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(500, 500);

frame.setLocationRelativeTo(null);

frame.setTitle("Label zentriert");

frame.setVisible(true);

}

private static JLabel createLabel() {

JLabel label = new JLabel("Ein Text", SwingConstants.CENTER);

label.setVerticalAlignment(JLabel.CENTER);

label.setBorder(new LineBorder(Color.BLACK));

return label;

}

}

0