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)时,只有文本继续缩放。如何让背景继续缩放?
答案 0 :(得分:2)
你不应该在paint方法中修改首选/最小/最大尺寸,这会产生意想不到的结果(导致另一次重绘)。
问题是父布局没有参考来确定组件的大小。也就是说,优选的/ in / max大小实际上是根据字体信息&amp;来计算的。此信息未被更改。
因此,虽然“看起来”组件正在调整大小,但它的实际大小并没有改变。
请尝试缩放原始字体大小。
AffineTransformation af = AffineTranfrmation.getScaleInstance(scale, scale);
Font font = originalFont.deriveFont(af);
setFont(font);
invalidate();
repaint();
当然你遇到了如果用户改变字体会发生什么的问题,但是有一点点标记,你应该能够克服它