CropImageFilter裁剪图像后,各个子图像有偏移

liuzhenpolestar 2011-08-27 02:19:47
我用CropImageFilter截取图片,截取后把图片放在了9个Jbutton上,但发现截取后的图片在button上不能拼到一块儿,在竖直方向上总是下面的图比上面的稍微偏一些。这是源代码,是一个puzzle游戏的。

package javaExp;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Puzzle extends JFrame implements ActionListener {
private JPanel centerPanel;
private JButton button;
private JLabel label;
private Image source;
private Image image;
int[][]pos;
int width,height;

public Puzzle(){
initUI();
}
public final void initUI(){
pos=new int[][]{
{0,1,2},
{3,4,5},
{6,7,8},
{9,10,11}
};
centerPanel=new JPanel();
centerPanel.setLayout(new GridLayout(4,3,0,0));
ImageIcon sid=new ImageIcon(Puzzle.class.getResource("satellite028(1).jpg"));
source=sid.getImage();

width=sid.getIconWidth();
height=sid.getIconHeight();
System.out.println(width);
System.out.println(height);
//add(Box.createRigidArea(new Dimension(0,5)),BorderLayout.NORTH);
add(centerPanel,BorderLayout.CENTER);

for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
if(j==2&&i==3){
label=new JLabel("");
centerPanel.add(label);
}
else{
button=new JButton();
//button.setBorder(null);
button.addActionListener(this);
//button.addActionListener(this);
centerPanel.add(button);
image=createImage(new FilteredImageSource(source.getSource(),new CropImageFilter(j*(width/3),i*(height/4),(width/3),height/4)));
button.setIcon(new ImageIcon(image));
System.out.println(j*(width/3));
System.out.println(i*(height/4));
System.out.println(width/3);
System.out.println(height/4);


}
}
}

setSize(width,height);
setTitle("Pupple");
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}
public void actionPerformed(ActionEvent e){
JButton button=(JButton)e.getSource();
Dimension size=button.getSize();

int labelX=label.getX();
int labelY=label.getY();
int buttonX=button.getX();
int buttonY=button.getY();
int buttonPosX=buttonX/size.width;
int buttonPosY=buttonY/size.height;
int buttonIndex=pos[buttonPosY][buttonPosX];
//label在下
if(labelX==buttonX &&(labelY-buttonY)==size.height){
int labelIndex=buttonIndex+3;

centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(label,buttonIndex);
centerPanel.add(button,labelIndex);
centerPanel.validate();
}
if(labelX==buttonX&&(labelY-buttonY)==-size.height){
int labelIndex=buttonIndex-3;
centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(button,labelIndex);
centerPanel.add(label,buttonIndex);
centerPanel.validate();
}
if(labelY==buttonY&&(labelX-buttonX)==size.width){
int labelIndex=buttonIndex+1;
centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(label,buttonIndex);
centerPanel.add(button,labelIndex);
centerPanel.validate();
}
if(labelY==buttonY&&(labelX-buttonX)==-size.width){
int labelIndex=buttonIndex-1;
centerPanel.remove(button);
centerPanel.remove(label);

centerPanel.add(button,labelIndex);
centerPanel.add(label,buttonIndex);
centerPanel.validate();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable(){
public void run(){
Puzzle pz=new Puzzle();
pz.setVisible(true);

}
});

}

}
不知道总是有点偏移,我用的图片是960×720的,所以可以长和宽都可以被整除,但不知道这个偏移量出在哪里?
请高手帮忙看一下!程序是在eclipse3.6,jdk1.6下可以正常无误的运行!
...全文
251 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuzhenpolestar 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huntor 的回复:]

Java code
button=new JButton();
//button.setBorder(null);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
……
[/Quote]
喔 明白了 哈哈谢谢逸飞了。我感觉这是insets的问题。因为JFrame的setSize()里的宽和高包含这标题的高度和边框的宽度。采用huntor的方法是先把button的大小固定,然后pack(),这样就不会出现这种问题了。这是查看一下frame的宽和高会发现比实际图片的宽和高要大,这多出来的值就是insets().left,insets().right,insets().buttom和insets().top了。
所以,我才用来在frame.setSize()时加上insets的做法,也避免了这个问题的发生如:
pz.setSize(width+pz.getInsets().left+pz.getInsets().right, height+pz.getInsets().top+pz.getInsets().bottom);

哈哈还是感谢逸飞的帮助。(不知道我这样想对不对。。。)
huntor 2011-08-30
  • 打赏
  • 举报
回复
button=new JButton(); 
//button.setBorder(null);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setFocusPainted(false);
button.setPreferredSize(new Dimension(width/3,height/4));

jbutton的大小设置为小图片的大小。

我在2L贴的代码在我这里运行时显示正常,没有错位的问题。
liuzhenpolestar 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huntor 的回复:]

问题在大小设置上.
窗口的大小比图片的要大。
[/Quote]
我怎么知道设置比图片大多少才能合适呢?不能一点点试吧
liuzhenpolestar 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huntor 的回复:]

Java code
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionLi……
[/Quote]
只是pack()不行啊!图片会在按钮的中心显示,而不会按按钮大小拉伸(没有覆盖按钮,只是在按钮的中心显示)
huntor 2011-08-27
  • 打赏
  • 举报
回复
问题在大小设置上.
窗口的大小比图片的要大。
huntor 2011-08-27
  • 打赏
  • 举报
回复
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Puzzle extends JFrame implements ActionListener {
private Image image;
private Image source;
private JButton button;
private JLabel label;
private JPanel centerPanel;
private final int[][] pos = {{0,1,2},{3,4,5},{6,7,8},{9,10,11}};
private int width,height;

public Puzzle(){
initUI();
}
private final void initUI(){
centerPanel=new JPanel();
centerPanel.setLayout(new GridLayout(4,3,0,0));
ImageIcon sid=new ImageIcon(Puzzle.class.getResource("satellite028(1).jpg"));
source=sid.getImage();

width=sid.getIconWidth();
height=sid.getIconHeight();
System.out.println(width);
System.out.println(height);
//add(Box.createRigidArea(new Dimension(0,5)),BorderLayout.NORTH);
add(centerPanel,BorderLayout.CENTER);

for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
if(j==2&&i==3){
label=new JLabel();
centerPanel.add(label);
}
else{
button=new JButton();
//button.setBorder(null);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setFocusPainted(false);
button.setPreferredSize(new Dimension(width/3,height/4));
button.addActionListener(this);
centerPanel.add(button);
image=createImage(new
FilteredImageSource(source.getSource(),
new CropImageFilter(j*(width/3),i*(height/4),(width/3),height/4)));
button.setIcon(new ImageIcon(image));
System.out.println(j*(width/3));
System.out.println(i*(height/4));
System.out.println(width/3);
System.out.println(height/4);
}
}
}

setTitle("Pupple");
pack();
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public void actionPerformed(ActionEvent e){
JButton button=(JButton)e.getSource();
Dimension size=button.getSize();

int labelX=label.getX();
int labelY=label.getY();
int buttonX=button.getX();
int buttonY=button.getY();
int buttonPosX=buttonX/size.width;
int buttonPosY=buttonY/size.height;
int buttonIndex=pos[buttonPosY][buttonPosX];
//label在下
if(labelX==buttonX &&(labelY-buttonY)==size.height){
int labelIndex=buttonIndex+3;

centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(label,buttonIndex);
centerPanel.add(button,labelIndex);
centerPanel.revalidate();
}
if(labelX==buttonX&&(labelY-buttonY)==-size.height){
int labelIndex=buttonIndex-3;
centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(button,labelIndex);
centerPanel.add(label,buttonIndex);
centerPanel.revalidate();
}
if(labelY==buttonY&&(labelX-buttonX)==size.width){
int labelIndex=buttonIndex+1;
centerPanel.remove(button);
centerPanel.remove(label);
centerPanel.add(label,buttonIndex);
centerPanel.add(button,labelIndex);
centerPanel.revalidate();
}
if(labelY==buttonY&&(labelX-buttonX)==-size.width){
int labelIndex=buttonIndex-1;
centerPanel.remove(button);
centerPanel.remove(label);

centerPanel.add(button,labelIndex);
centerPanel.add(label,buttonIndex);
centerPanel.revalidate();
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
Puzzle pz=new Puzzle();
pz.setVisible(true);
}
});
}

}
liuzhenpolestar 2011-08-27
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧