[Java] String in het midden van een JPanel tekenen

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Wat ik wil is een string midden in een label hebben, maar wel 1 die meeresized als het JPanel resized.

Eerst heb ik het geprobeerd met een JLabel, maar dat gaf een probleempje: het resizen van de label ging in paintComponent, maar door dat resizen werd de panels repaint() en dus de paintComponent weer aangeroepen. Gevolg: 100% processorgebruik.

De code daarvoor:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    // in de constructor
    setLayout(new BorderLayout());
    label = new JLabel("bladiebla");
    label.setHorizontalAlignment(JLabel.CENTER);
    add(label, BorderLayout.CENTER);

...

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    // Resizing this way takes too much processor resources.
    String t = label.getText();
    double w = g.getFontMetrics().stringWidth(t);
    AffineTransform at = new AffineTransform();
    w = getSize().width / w * 0.95;
    at.scale(w, w);
    Font f = label.getFont();
    label.setFont(f.deriveFont(at));
}
Zoals al gezegd, dit werkt goed maar vreet resources.

Dus dan maar proberen met Graphics.drawString:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private static String LABEL = "Test string";

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (!fontSet)
    {
        g.setFont(g.getFont().deriveFont(Font.BOLD));
        fontSet = true;
    }
    double w = g.getFontMetrics().stringWidth(LABEL);
    AffineTransform at = new AffineTransform();
    w = getSize().width / w * 0.95;
    at.scale(w, w);
    g.setFont(g.getFont().deriveFont(at));
    int w1 = g.getFontMetrics().stringWidth(LABEL);
    int h1 = g.getFontMetrics().getHeight();
    g.drawString(
        LABEL, (getSize().width - w1) / 2,
        (getSize().height + h1) / 2
    );
}
Die 0.95 is om wat ruimte tussen de zijkanten en de string te hebben. Horizontaal staat die string nu goed, maar verticaal staat ie te laag. Als ik h1 op 0 zet dan staat de string net te hoog. Ik heb ook geprobeerd met de g.getFontMetrics().getLineMetrics(...), maar dat deed precies hetzelfde als dit

Weet iemand hoe het wel kan, zonder dus mijn proc voor 100% te belasten zoals in mijn eerste poging?

[ Voor 8% gewijzigd door Robtimus op 19-01-2004 10:35 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 27-05 21:44

Robtimus

me Robtimus no like you

Topicstarter
Ik heb denk ik al een oplossing gevonden: als ik eerst de label verwijder, dan de font set en daarna weer toevoeg lijkt ie het goed te doen.

Als iemand een elegantere oplossing weet, graag!

More than meets the eye
There is no I in TEAM... but there is ME
system specs