我用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下可以正常无误的运行!
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下可以正常无误的运行!
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);
}
});
}}
//button.setBorder(null);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setFocusPainted(false);
button.setPreferredSize(new Dimension(width/3,height/4));
jbutton的大小设置为小图片的大小。我在2L贴的代码在我这里运行时显示正常,没有错位的问题。
所以,我才用来在frame.setSize()时加上insets的做法,也避免了这个问题的发生如:
pz.setSize(width+pz.getInsets().left+pz.getInsets().right, height+pz.getInsets().top+pz.getInsets().bottom);
哈哈还是感谢逸飞的帮助。(不知道我这样想对不对)