java多层组件内画图 本帖最后由 sgwhp 于 2011-10-17 01:16:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把JPanel panel = new JPanel();修改成为JPanel panel = new JPanel(new BorderLayout());试试看 按照你的修改之后确实可以,这是为什么?另外,如果要求为FlowLayout要怎么办? 流式布局可以采用两个panel去做啊. 可以说具体点么,俺很菜还有,为啥用BorderLayout才能画出来呢?多谢了 在new JPanel的时候使用一下语句可以解决之前出现的问题: JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){ @Override public Dimension getPreferredSize() { return new Dimension (180,200); } };但是在这个JPanel内只能显示第一张添加的图片,第二张无法显示。把修改过后的代码再帖上来吧,麻烦各位花点时间帮我分析一下,多谢了。import javax.imageio.*;import javax.swing.*;import java.awt.*;import java.awt.geom.*;import java.io.*;public class ImgP extends JFrame{ ImageCanvas ic; public ImgP(){ Image image; setSize(700, 500); JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){ @Override public Dimension getPreferredSize() { return new Dimension (180,200); } }; try { image = ImageIO.read(new File("G:\\Image\\化一通讯录.jpg")); ic = new ImageCanvas(); ic.setImage(image); j.add(ic); //j2.add(ic) image = ImageIO.read(new File("G:\\Image\\IMG_0783.jpg")); ic = new ImageCanvas(); ic.setImage(image); j.add(ic); add(j); } catch (IOException ex) { } } public static void main(String[] args) { ImgP ip = new ImgP(); ip.setVisible(true); ip.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }} class ImageCanvas extends JComponent{ Image img; double ratio; AffineTransform af = AffineTransform.getScaleInstance(1,1); public ImageCanvas(){ setSize(180, 200); } void setImage(Image m){ img = m; calculateRatio(img.getWidth(null), img.getHeight(null)); concateZoom(ratio); } void concateZoom(double scale){ if (img==null)return; af.preConcatenate(AffineTransform.getScaleInstance(scale,scale)); paintImmediately(getBounds()); } @Override protected void paintComponent(Graphics g) { System.out.println(img.getWidth(null) + " " + getX() + " " + getY()); super.paintComponent(g); if (img==null) { g.setColor(Color.BLACK); g.fillRect(0,0,getWidth(),getHeight()); } else { Graphics2D g2d = (Graphics2D)g; g2d.setTransform(af); g2d.drawImage(img, (int)(((getWidth()-img.getWidth(null)*ratio)/2)/ratio), (int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this); } } final void calculateRatio(int width, int height){ if(getWidth()>=width && getHeight()>=height){ ratio = 1; } if((double)getWidth()/width > (double)getHeight()/height) ratio = (double)getHeight() / height; else ratio = (double)getWidth() / width; } @Override public Dimension getPreferredSize() {return new Dimension(180, 200);} } g2d.drawImage(img, (int)(((getWidth()-img.getWidth(null)*ratio)/2)/ratio), (int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this);改成g2d.drawImage(img, af, this);后可以解决这个问题,但是不能保证图片居中显示。 FlowLayout是流布局,每个组件上下左右都有间隔,间隔太远就看不到了。borderLayout是边框布局,每次放一个组件而又没有规定组件位置的话,默认放置到中间位置 windows JAVA乱码的问题 用java分配一个确定大小的存储空间的疑惑 关于同时监听按钮和键盘回车的问题 如何实现jsp中对文件中固定行的修改或删除 各位大哥:帮帮忙:怎么样才能将applet程序显示在浏览器上面?? 1 怎样高效率的拼接一个大字符串? 怎样在字符窜的某个位置插入字符? “[Microsoft][ODBC 驱动程序 管理器] 非法的描述器索引”是怎么回事儿?谢谢 java获取CPU利用率时报错,大神们,帮帮忙 节点流ObjectOutputStream和FileOutputStream使用 的疑惑 java 开多线程,反而变慢,请教高手?
修改成为
JPanel panel = new JPanel(new BorderLayout());试试看
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){
@Override
public Dimension getPreferredSize() {
return new Dimension (180,200);
}
};但是在这个JPanel内只能显示第一张添加的图片,第二张无法显示。把修改过后的代码再帖上来吧,麻烦各位花点时间帮我分析一下,多谢了。
import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.io.*;public class ImgP extends JFrame{
ImageCanvas ic; public ImgP(){
Image image;
setSize(700, 500);
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){
@Override
public Dimension getPreferredSize() {
return new Dimension (180,200);
}
};
try {
image = ImageIO.read(new File("G:\\Image\\化一通讯录.jpg"));
ic = new ImageCanvas();
ic.setImage(image);
j.add(ic);
//j2.add(ic)
image = ImageIO.read(new File("G:\\Image\\IMG_0783.jpg"));
ic = new ImageCanvas();
ic.setImage(image);
j.add(ic);
add(j);
} catch (IOException ex) {
}
}
public static void main(String[] args) {
ImgP ip = new ImgP();
ip.setVisible(true);
ip.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} class ImageCanvas extends JComponent{
Image img;
double ratio;
AffineTransform af = AffineTransform.getScaleInstance(1,1);
public ImageCanvas(){
setSize(180, 200);
}
void setImage(Image m){
img = m;
calculateRatio(img.getWidth(null), img.getHeight(null));
concateZoom(ratio);
}
void concateZoom(double scale){
if (img==null)return;
af.preConcatenate(AffineTransform.getScaleInstance(scale,scale));
paintImmediately(getBounds());
}
@Override
protected void paintComponent(Graphics g) {
System.out.println(img.getWidth(null) + " " + getX() + " " + getY());
super.paintComponent(g);
if (img==null) {
g.setColor(Color.BLACK);
g.fillRect(0,0,getWidth(),getHeight());
}
else {
Graphics2D g2d = (Graphics2D)g;
g2d.setTransform(af);
g2d.drawImage(img, (int)(((getWidth()-img.getWidth(null)*ratio)/2)/ratio),
(int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this);
}
} final void calculateRatio(int width, int height){
if(getWidth()>=width && getHeight()>=height){
ratio = 1;
}
if((double)getWidth()/width > (double)getHeight()/height)
ratio = (double)getHeight() / height;
else ratio = (double)getWidth() / width;
} @Override
public Dimension getPreferredSize() {return new Dimension(180, 200);}
}
(int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this);
改成g2d.drawImage(img, af, this);后可以解决这个问题,但是不能保证图片居中显示。