高手能否写一个如下的例子:JFrame的一个窗口,里面一个JLabel显示窗口的大小。
每次用户拖动窗口的时候,更新JLabel的数值。谢谢。

解决方案 »

  1.   

    import javax.swing.*;
    import java.awt.event.*;public class Test {
    public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setSize(400, 300);
    final JLabel label = new JLabel();
    frame.add(label);
    frame.addComponentListener(new ComponentAdapter() {
    public void componentResized(ComponentEvent e) {
    label.setText(frame.getWidth() + "," + frame.getHeight());
    }
    });
    frame.setVisible(true);
    }
    }这个是每次拖动完放开鼠标以后才显示数字的
      

  2.   


    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.event.WindowStateListener;import javax.swing.JFrame;
    import javax.swing.JLabel;
    public class MainFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    private JLabel label = null;
    public void sizeChanged(int width, int height) {

    String msg = String.format("Width: %d ; Height: %d", this.getWidth(), this.getHeight());
    label.setText(msg);
    }

    public void init() {
    String msg = String.format("Width: %d ; Height: %d", this.getWidth(), this.getHeight());
    label = new JLabel(msg);
    this.add(label);
    }




    public static void main(String[] args) {
    final MainFrame mframe = new MainFrame();
    mframe.addComponentListener(new ComponentListener() {

    @Override
    public void componentShown(ComponentEvent arg0) {
    // TODO Auto-generated method stub

    }

    @Override
    public void componentResized(ComponentEvent arg0) {
    mframe.sizeChanged(arg0.getComponent().getWidth(), arg0.getComponent().getHeight());

    }

    @Override
    public void componentMoved(ComponentEvent arg0) {
    // TODO Auto-generated method stub

    }

    @Override
    public void componentHidden(ComponentEvent arg0) {
    // TODO Auto-generated method stub

    }
    });

    mframe.init();
    mframe.setVisible(true);
    }
    }
      

  3.   

    写得慢了,就说明重点吧,
    frame.addComponentListener(
    这里。
      

  4.   

    楼上两位神速。还想请教一下实现的过程。
    当窗口大小改变之后,是怎样重新绘制的窗口呢?
    不需要使用paintComponent或者repaint这样的函数吗?
    谢谢。
      

  5.   

    楼主的提示也给了我解决问题的新方法,这回就可以一边拖动一边更新了,不用等到放开鼠标之后。import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;public class Test {
    public static void main(String[] args) {
    final JLabel label = new JLabel();
    final JFrame frame = new JFrame();
    JPanel panel = new JPanel() {
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    label.setText(frame.getWidth() + ", " + frame.getHeight());
    }
    };
    panel.setLayout(new BorderLayout());
    frame.setContentPane(panel);
    frame.setSize(400, 300);
    frame.add(label);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }不过这样刷新JLabel比较频繁。窗口大小改变时,Swing的调度线程自然会调用paintComponent方法,不用程序员完成调用。
      

  6.   

    因为swing已经封装好了ComponentListener监听,所以不需要使用paintComponent或者repaint这样的函数。
      

  7.   

    给大家介绍一个java交流QQ群96040430,工程师请进