最小尺寸 最大尺寸和首选尺寸
Void setMaxmumSize(Dimension) 设置组件的最大尺寸
Void setMinimumSize(Dimension) 设置组件的最小尺寸
Void setPreferredSize(Dimension) 设置组件的首选尺寸
Dimension getMaxmumSize() 返回组件的最大尺寸
Dimension getMinimumSize() 返回组件的最小尺寸
Dimension getPreferredSize() 返回组件的首选尺寸
如果显示的设置组件的尺寸,该尺寸值从get方法返回。
如果没有显示的设置组件的尺寸而且组件有一个UI代表,则调用这个UI代表来计算组件的尺寸。
如果没有显示的设置组件的且组件没有UI代表,则调用超类来计算组件的尺寸。
例:
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
public class Getsize extends JApplet
JComboBox sizecombo = new JComboBox(new Object[] { "null", "100*100" });
JList list = new JList(new Object[] { "item 1", "item 2", "item 3", "item 4", "item 5", "item 6" });
public void init()
{
final Container contentpane = getContentPane();
list.setBorder(BorderFactory.createLineBorder(Color.black));
sizecombo.setSelectedIndex(0);
contentpane.setLayout(new FlowLayout());
contentpane.add(list);
contentpane.add(new JLabel("preferred size for list:"));
contentpane.add(sizecombo);
sizecombo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int index = sizecombo.getSelectedIndex();
if (index == 0)
list.setPreferredSize(null);
else
list.setPreferredSize(new Dimension(100, 100));
list.revalidate();
}
});
}
JComponent.paint方法来绘制轻量Swing 组件。
JComponent.paint先绘制组件,然后绘制组件的边框,再绘制组件的子组件。调用的顺序确保组件,边框和子组件都是可视的。
Swing和awt 组件通常由它们容器的布局管理器来定位和给出大小(布局)。在任何给定时刻,一个组件不是有效的就是无效的;无效的组件需要被布局,而有效的组件则不需要被布局。
例如:
在一个按钮构造后要设置这个按钮的文本,则很可能该按钮需要重新安排大小以容纳下这个新文本。因此,设置按钮的文本导致按钮是无效的(通过为该按钮设置invalidate(), 指示该按钮需要被布局)。
Swing和awt的containers都提供了一个validate方法,该方法可为容器中的所有组件布局。
例如:有一个容器,它含有一个按钮,且这个按钮的文本已经改变(因此是无效的),如果为该容器调用validate(),则该容器将布局这个按钮及该容器中的所有其他组件。
Revalidate()
JComponent类提供了一个revalidate方法,这个方法是组件无效并为组件层次结构中的第一个容器在事件派发线程上安排一个validate()的调用,如果组件的isValidateRoot属性被设置为true的话。因为包含在JApplet或JFrame实例中的所有swing组件都在根面板中,所以为swing小应用程序或应用程序中的一个swing组件调用revalidate()将使该组件被布局。在组件布局后,已改变的组件区域将重新绘制。
关于JComponent.revalidate() 三点注意:
1 对调用revalidate(0的调用是合并的。如果某个容器中的多个组件连续调用revalidate(),则这些revalidate()调用将合并,即只调用一次revalidate()。
2 任何为改变未知和大小而改变的swing组件应该通过组件本身来重新生效,布局和重新绘制组件。
3 虽然对JComponent.revalidate()的调用应该使已经变化了的组件域重新绘制,但是重新绘制不总是发生。因此,有时需要在调用revalidate()后,在调用repaint()。
不透明组件与透明组件
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JPanel;
public class OpaqueModel extends JApplet
public void init()
{
Container contentpane=getContentPane();
RainPanel raipanel=new RainPanel();
ColoredPanel opaque=new ColoredPanel(),transparent=new ColoredPanel();
//缺省时,swing组件是不透明的,所以不需要为opaque面便设置不透明属性。
//transparent.setOpaque(false) 允许背景显示出来
transparent.setOpaque(false);
raipanel.add(opaque);
raipanel.add(transparent);
contentpane.add(raipanel,BorderLayout.CENTER);
}
class RainPanel extends JPanel
{
ImageIcon rain=new ImageIcon("4.jpg");
private int rainw=rain.getIconWidth();
private int rainh=rain.getIconHeight();
public void paintComponent(Graphics g)
{
Dimension size=getSize();
for(int row=0;row<size.height;row+=rainh)
for(int col=0;col<size.width;col+=rainw)
rain.paintIcon(this, g, col, row);
}
}
class ColoredPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Dimension size=getSize();
g.setColor(Color.black);
g.drawRect(0, 0, size.width-1, size.height-1);
g.setColor(Color.red);
g.fillRect(size.width/2-25, size.height/2-25, 50, 50);
}
public Dimension getPreferredSize()
{
return new Dimension(100,100);
}
}