gpt4 book ai didi

java - 通过重写paintComponent()来缩放JLabel

转载 作者:行者123 更新时间:2023-11-30 04:43:59 24 4
gpt4 key购买 nike

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

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) 时,只有文本继续缩放。如何让背景继续缩放?

最佳答案

您不应该在绘制方法中修改首选/最小/最大尺寸,这可能会产生意外结果(导致另一次重新绘制)。

问题是父布局没有引用来确定组件的大小。也就是说,首选/英寸/最大尺寸实际上是根据字体信息计算的,并且该信息没有改变。

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

尝试根据原始字体大小进行缩放。

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

invalidate();
repaint();

当然,您会遇到如果用户更改字体会发生什么的问题,但是通过一点标记,您应该能够克服这个问题

关于java - 通过重写paintComponent()来缩放JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com