如何获得定制组件的最佳尺寸?

时间:2018-07-01 20:03:07

标签: java swing jcomponent

我已经编写了一个自定义组件:

public class ImageView extends JComponent {

    private BufferedImage mImage;

    public ImageView() {
        this(480, 320);
    }



    public ImageView(int width, int height) {
        mImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        clear();
    }



    public BufferedImage getImage() {
        return mImage;
    }

    public void setImage(BufferedImage image) {
        mImage = image;
    }

    public void clear() {
        Graphics g = mImage.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, mImage.getWidth(), mImage.getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(mImage.getWidth(), mImage.getHeight());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        int x = (getWidth() - mImage.getWidth()) / 2;
        int y = (getHeight() - mImage.getHeight()) / 2;
        g.drawImage(mImage, x, y,this);
    }
}

但是如果用户调用默认构造函数,如何以最佳大小初始化mImage使其大小与我的组件相同?

1 个答案:

答案 0 :(得分:1)

虽然您的问题有些含糊,但我“认为”这是您要问的问题...

allNodesOnScreen

基本上,当public class ImageView extends JComponent { protected static final Dimension DEFAULT_SIZE = new Dimension(480, 320); private BufferedImage mImage; public ImageView() { setBackground(Color.WHITE); } public ImageView(int width, int height) { this(); mImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); clear(); } public BufferedImage getImage() { return mImage; } public void setImage(BufferedImage image) { mImage = image; } public void clear() { if (mImage == null) { return; } Graphics g = mImage.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, mImage.getWidth(), mImage.getHeight()); g.dispose(); } @Override public Dimension getPreferredSize() { return mImage == null ? DEFAULT_SIZE : new Dimension(mImage.getWidth(), mImage.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (mImage == null) { return; } //g.setColor(Color.white); //g.fillRect(0, 0, getWidth(), getHeight()); int x = (getWidth() - mImage.getWidth()) / 2; int y = (getHeight() - mImage.getHeight()) / 2; g.drawImage(mImage, x, y,this); } } mImage时,它将返回组件的预定义null(以及不绘制图像)

  

不,我想获得父级布局管理器将为我的组件设置的尺寸。如果我的组件要填充布局管理器提供的所有可用空间,我想获取该空间的大小。即我可以设置默认的构造函数300x300图像大小,但是我的组件将具有400x300,因为布局管理器允许填充更大的空间。我如何获得启动后组件真正具有的大小。

直到该组件由父容器物理布局,否则无法知道它将赋予它的大小。您可以监视对DEFAULT_SIZE的更改,但是我倾向于找到setBounds更好的选择(IMHO)。

问题是,所有这些方法都可以快速连续调用多次,因此,如果您执行的操作耗时或可能需要较大的内存,则最好使用某种“延迟回调” ”,则在执行所需的操作之前,必须经过一定的时间。

我倾向于使用Swing invalidate来做到这一点,这很简单,并且在EDT上调用了Timer,因此可以安全地从

更新用户界面
ActionListener