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:
Dus dan maar proberen met Graphics.drawString:
Weet iemand hoe het wel kan, zonder dus mijn proc voor 100% te belasten zoals in mijn eerste poging?
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:
Zoals al gezegd, dit werkt goed maar vreet resources.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)); } |
Dus dan maar proberen met Graphics.drawString:
Java:
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 dit1
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 ); } |
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