通过覆盖paintComponent()来缩放JLabel

时间:2012-07-18 13:37:58

标签: java swing zoom jlabel paintcomponent

考虑这个小的可运行示例:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test2 extends JFrame implements MouseWheelListener{
        ArrayList<JLabel> lista = new ArrayList<JLabel>();
        JPanel p;
        double d = 0.1;
        Test2(){
        p=new JPanel();
        _JLabel j = new _JLabel("Hello");
        j.setOpaque(true);
        j.setBackground(Color.yellow);
        p.add(j);
        p.setBackground(Color.blue);
        add(p);
        this.setVisible(true);
        this.setSize(400,400);
        addMouseWheelListener(this);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String args[]){
        new Test2();
    }
    private class _JLabel extends JLabel{

        _JLabel(String s){
            super(s);
        }

        protected void paintComponent(Graphics g) {
            d+=0.01;
            Graphics2D g2d = (Graphics2D) g;
            g2d.scale(d, d);
            setMaximumSize(null);
            setPreferredSize(null);
            setMinimumSize(null);
            super.paintComponent(g2d);
            System.out.println("d= " +d);
        }
    }
    public void mouseWheelMoved(MouseWheelEvent e) {
            this.repaint();
    }

}

当我滚动鼠标滚轮时,JLabel的尺寸增加,变量d被打印出来。但是,当它达到实际大小(d = 1)时,只有文本继续缩放。如何让背景继续缩放?

1 个答案:

答案 0 :(得分:2)

你不应该在paint方法中修改首选/最小/最大尺寸,这会产生意想不到的结果(导致另一次重绘)。

问题是父布局没有参考来确定组件的大小。也就是说,优选的/ in / max大小实际上是根据字体信息&amp;来计算的。此信息未被更改。

因此,虽然“看起来”组件正在调整大小,但它的实际大小并没有改变。

请尝试缩放原始字体大小。

AffineTransformation af = AffineTranfrmation.getScaleInstance(scale, scale);
Font font = originalFont.deriveFont(af);
setFont(font);

invalidate();
repaint();

当然你遇到了如果用户改变字体会发生什么的问题,但是有一点点标记,你应该能够克服它