让窗口上的图标、标签文字等随窗口大小改变
Java swing里有办法没?

解决方案 »

  1.   

    楼主没说清楚,不知道是窗体标题栏还是窗体内部。标题栏的话,只能是自定义标题栏,自己写代码搞定。窗体内部的话,有两种办法:第一种,继承组件,比如JLabel什么的,然后覆盖paintComponent方法,自己根据组件的大小绘制组件内部的图标和文字,然后用布局管理器控制。主要是因为布局管理器虽然能控制组件大小,却无法控制组件的图标和文字大小,窗体大小改变时,会进行重绘,会自动调用paintComponent方法,所以在paintComponent方法里面根据组件的大小绘制图标文字就有用。第二种,添加ComponentListener,监听componentResized事件,然后做出事件处理。个人比较推荐第一种,因为一劳永逸,以后需要的时候使用这个组件就行了。
      

  2.   

    import javax.swing.*;
    import java.awt.*;public class ResizeLabel extends JLabel {
    public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(400, 60);
    JLabel label = new ResizeLabel();
    label.setText("label");
    label.setOpaque(true);
    label.setIcon(new ImageIcon("web.gif"));
    frame.add(label);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void paintComponent(Graphics g) {
    // super.paintComponent(g);
    int height = getHeight();
    Font oldFont = getFont();
    setFont(new Font(oldFont.getName(), oldFont.getStyle(), height));
    Icon icon = getIcon();
    String text = getText();
    if (icon != null && icon instanceof ImageIcon) {
    double scale = (double)icon.getIconWidth() / icon.getIconHeight();
    int width = (int)(height * scale);
    ImageIcon image = (ImageIcon)icon;
    g.drawImage(image.getImage(), 0, 0, width, height, null);
    g.drawString(text, width, (int)(height * 0.85));
    } else {
    g.drawString(text, 0, (int)(height * 0.85));
    }
    }
    }写了个小例子,大致可以用,有瑕疵,调了半天没调出来,楼主可以继承JComponent,自己画就不会有任何干扰了。
      

  3.   

    Zooming user interface
    下面ZUI Projects有三个Java相关的,可以去看看。