我已经编写了一个自定义组件:
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
使其大小与我的组件相同?
答案 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