1

この小さな実行可能な例を考えてみましょう。

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)に達すると、テキストのみがズームを続けます。背景をズームし続けるにはどうすればよいですか?

4

1 に答える 1

2

ペイント方法でpreferred/min / maxサイズを変更しないでください。この方法では、予期しない結果が発生します(別の再ペイントが発生します)。

問題は、親レイアウトにコンポーネントのサイズを決定するための参照がないことです。つまり、preferred / in / maxサイズは、実際にはフォント情報に基づいて計算され、この情報は変更されません。

そのため、コンポーネントのサイズが変更されているように見えますが、実際のサイズは変更されていません。

代わりに、元のフォントサイズに対して拡大縮小してみてください。

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

invalidate();
repaint();

もちろん、ユーザーがフォントを変更するとどうなるかという問題に遭遇しますが、少しフラグを立てれば、それを克服できるはずです。

于 2012-07-18T14:24:11.003 に答える