如何在Swing组件大小调整上"做点什么"?

20 java swing

我有一个课程延伸JPanel.我覆盖了protected void paintComponent(Graphics g).

当面板的尺寸发生变化时,必须重新计算变量.我该如何正确地做到这一点?

Cha*_*nia 30

就像Adam Paynter建议的那样,你也可以在你的代码中添加一个内部类,如下所示:

class ResizeListener extends ComponentAdapter {
        public void componentResized(ComponentEvent e) {
            // Recalculate the variable you mentioned
        }
}
Run Code Online (Sandbox Code Playgroud)

每次调整组件大小时,都会在最里面的括号之间输入代码.

然后将此侦听器添加到组件中

myJPanel.addComponentListener(new ResizeListener());
Run Code Online (Sandbox Code Playgroud)

您可以使用以获取组件e.getComponent().这样你就可以从内部类中调用组件的任何方法

e.getComponent().getWeight();
Run Code Online (Sandbox Code Playgroud)


Ada*_*ter 17

我想你可以覆盖各种setSizeresize方法和执行计算那里.但是,您可能找不到可以更改大小的所有位置.您可能希望让您的类实现ComponentListener并简单地监听自己的resize事件.

警告:我不是Swing专家.

警告:我还没有编译这段代码.

public class MyJPanel extends JPanel implements ComponentListener {

    public MyJPanel() {
        this.addComponentListener(this);
    }

    public void paintComponent(Graphics g) {
        // Paint, paint, paint...
    }

    public void componentResized(ComponentEvent e) {
        // Perform calculation here
    }

    public void componentHidden(ComponentEvent e) {}

    public void componentMoved(ComponentEvent e) {}

    public void componentShown(ComponentEvent e) {}

}
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果组件已调整大小,但未绘制,则可能不想重新计算任何内容 (2认同)

cam*_*ckr 13

如果我正确理解了这个问题,那么你应该阅读Swing教程中关于如何编写组件监听器的部分,该教程向您展示如何监听组件大小的变化.


jjn*_*guy 7

如果计算不耗时,我只会在paintComponent().

否则,您可以保存一个作为组件大小的值,并根据 中的新大小进行检查paintComponent。如果大小改变,则重新计算,否则不要。

private Dimension size;

protected void paintComponent(Graphics g){
    if (!size.equals(getSize())){
        size = getSize();
        // recalculate value
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以对调整大小事件进行计算。

//in the constructor add the line
addComponentListener(resizeListener);

private ComponentListener resizeListener = new ComponentAdapter(){
    public void componentResized(ActionEvent e){
        // recalculate value
    }
};
Run Code Online (Sandbox Code Playgroud)