为什么图片会重叠?

xxxadi 2010-01-14 01:14:34
写了一个Cell类继承自JPanel。
构造方法如下:
public Cell(){
this.setOpaque(false);
this.setPreferredSize(new Dimension(40, 40));
this.addMouseListener(new MouseListener());
}
paintComponent方法里面重写为:
Image img = ImageIO.read(new File("image/number/已知" + i + ".png"));
g.drawImage(img, 0, 0, 40, 40, this);

然后又写了一个Grid类继承自JPanel。
构造方法如下:
public class Grid extends JPanel{
Cell[][] grid = new Cell[3][3];

public Grid() {
this.setOpaque(false);
this.setPreferredSize(new Dimension(122, 122));
this.setLayout(new GridLayout(3, 3, 1, 1));
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
grid[i][j] = new Cell();
this.add(grid[i][j]);
}
}
}

}

然后又搞了个Sudoku类继承自JFrame。
构造方法里主要含有:
Grid part = new grid();
gamePanelBlue.add(part);//gamePanelBlue是Sudoku的构造方法中定义的一个JPanel
part.setBounds(496, 318, 122, 122);

结果运行之后显示出来是9个图片叠加起来的状况(1在最上面。。因为图片是透明的所以看得出来)
而且这些叠加的图片只能显示半截。。= =
如果改成FlowLayout就能显示全。但是还是叠加起来的状况

这是怎么回事呢?GridLayout是在起作用(移到这些图片应在的位置上那些图片有选中的效果)
但是为什么画出的图片都堆在左上角了?而不是在自己的那个cell里面?

纠结一天了。。。T T这个要怎么改才行?先谢过各位大牛了~~~~~~
...全文
355 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxxadi 2010-01-15
  • 打赏
  • 举报
回复
终于找到问题了。。透明的图片像素为0。。= =所以几个背景透明的图片都叠一起了~~
不过还是要谢谢楼上~~^ ^
focusforce 2010-01-15
  • 打赏
  • 举报
回复
代码编译不过,看得累死了,给你一段我写的代码,看看是否对你有用。

public class HomePageModulePanel extends JPanel
{
private ImageIcon wallpaper;
public HomePageModulePanel(String title)
{
if (title.equals("mokuai1"))
{
wallpaper = ImageIconUtil.getImageIcon("01.PNG");
}
else if(title.equals("mokuai2"))
{
wallpaper = ImageIconUtil.getImageIcon("02.PNG");
}
......
}
protected void paintComponent(Graphics g)
{
// Image image = wallpaper.getImage();
int cw = getWidth();
int ch = getHeight();

ImageIcon scaledSymbol = new ImageIcon(wallpaper.getImage()
.getScaledInstance(cw, ch, Image.SCALE_SMOOTH));
g.drawImage(scaledSymbol.getImage(), 0, 0, this);
}
}
}


public class HomePagePanel extends JPanel
{
public HomePagePanel()
{
super();
setBorder(new EmptyBorder(8, 8, 8, 8));
setLayout(new GridLayout(3, 2, 8, 8));
initView();
}

public void initView()
{
add(new HomePageModulePanel("mokuai1"));
add(new HomePageModulePanel("mokuai2"));
......
}

}
xxxadi 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 focusforce 的回复:]
我洗澡完上来仔细看了再回复,swing比较精通,乐于解决问题:)
[/Quote]

谢谢!!
另外Cell类某些地方我小改了些内容。。不过还是显示重叠的- -

focusforce 2010-01-15
  • 打赏
  • 举报
回复
我洗澡完上来仔细看了再回复,swing比较精通,乐于解决问题:)
xxxadi 2010-01-15
  • 打赏
  • 举报
回复
Cell类:

public class Cell extends JPanel{
//该位置存储的数
private int number;
//该位置能否被修改
private boolean changeable;
//判断该位置是否属于答案区
private boolean belongsToAnswersPart;
//判断该位置是否属于出题区(用户自定义题目时使用)
private boolean belongsToQuestionsPart;
//该位置的坐标
private int x, y;
//判断鼠标是否已进入该位置
private boolean enter;
//判断该位置是否已被选中
private boolean chosen;
//判断该位置是否属于自定义时的地图
private boolean belongsToCustom;


public Cell(){
this.setOpaque(false);
this.setPreferredSize(new Dimension(40, 40));
this.addMouseListener(new MouseListener());



}

public int getNumber(){
return this.number;
}

public void setNumber(int num){
this.number = num;
repaint();
}

public boolean getChangeable(){
return this.changeable;
}

public void setChangeable(boolean changeable){
this.changeable = changeable;
}

public boolean getBelongsToAnswersPart(){
return this.belongsToAnswersPart;
}

public void setBelongsToAnswersPart(boolean isAnswersPart){
this.belongsToAnswersPart = isAnswersPart;
}

public boolean getBelongsToQuestionsPart(){
return this.belongsToQuestionsPart;
}

public void setBelongsToQuestionsPart(boolean isQuestionsPart){
this.belongsToAnswersPart = isQuestionsPart;
}


public int getX(){
return this.x;
}

public void setX(int x){
this.x = x;
}

public int getY(){
return this.y;
}

public void setY(int y){
this.y = y;
}

public boolean getEnter(){
return this.enter;
}

public void setEnter(boolean enter){
this.enter = enter;
repaint();
}

public boolean getChosen(){
return this.chosen;
}

public void setChosen(){
this.chosen = !this.chosen;
repaint();
}

public void setChosen(boolean choose){
this.chosen = choose;
repaint();
}

public boolean getBelongsToCustom(){
return this.belongsToCustom;
}

public void setBelongsToCustom(boolean belongsToCustom){
this.belongsToCustom = belongsToCustom;
}

protected void paintComponent(Graphics g){
super.paintComponent(g);

if (this.getChosen()){
Graphics2D g2d=(Graphics2D)g;
Stroke stroke=new BasicStroke(5.0f);
g2d.setStroke(stroke);
g2d.setColor(Color.RED);
g2d.drawRoundRect(0, 0, 40, 40, 10, 10);
}

if (this.getEnter()){
Graphics2D g2d=(Graphics2D)g;
Stroke stroke=new BasicStroke(4.0f);
g2d.setStroke(stroke);
g2d.setColor(Color.PINK);
g2d.drawRoundRect(0, 0, 40, 40, 10, 10);
}

for(int i = 1; i < 10; i++){
if(this.number == i){
if((this.getChangeable() == false && this.getBelongsToAnswersPart() == false ) || this.getBelongsToCustom()){
try {
Image img = ImageIO.read(new File("image/number/已知" + i + ".png"));
g.drawImage(img,0, 0, 40, 40, this);
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "找不到图片!");
}
}
else {
try {
Image img = ImageIO.read(new File("image/number/输入" + i + ".png"));
g.drawImage(img, 0, 0, 40, 40, this);
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "找不到图片!");
}
}
}
}




if (!(this.getBelongsToAnswersPart() || this.getBelongsToQuestionsPart())){
if (this.isRepeated(Cell.this.getNumber())){
try {
Image img = ImageIO.read(new File("image/number/重复.png"));
g.drawImage(img, 0, 0, 40, 40, this);
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "找不到图片!");
}
}
}

}


private class MouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent e){
if(Cell.this.getChangeable()){
Cell.this.setChosen();
if(Cell.this.getBelongsToCustom()){
CustomizedSudoku.setSiteSelected();
}else {
Sudoku.setSiteSelected();
}


if(!(Cell.this.getBelongsToAnswersPart() || Cell.this.getBelongsToQuestionsPart())){
if (Cell.this.getChosen()){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if (i != Cell.this.getX() && j != Cell.this.getY()){
if (Cell.this.getBelongsToCustom()){
CustomizedSudoku.sudoku[i / 3][j / 3].grid[i % 3][j % 3].setChosen(false);
}else {
Sudoku.sudoku[i / 3][j / 3].grid[i % 3][j % 3].setChosen(false);
}
}
}
}
}
}

//该位置被选中
if(Cell.this.getBelongsToCustom()){
CustomizedSudoku.setLastX(Cell.this.getX());
CustomizedSudoku.setLastY(Cell.this.getY());
}else{
Sudoku.setLastX(Cell.this.getX());
Sudoku.setLastY(Cell.this.getY());
}
}
else if(Cell.this.getBelongsToAnswersPart()){
//已经有位置被选中了
if(Sudoku.getSiteSelected()){
//重复与否判断
if (!Cell.this.isRepeated(Cell.this.getNumber())){
Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
Sudoku.displayArray[Sudoku.getLastX()][Sudoku.getLastY()] = Cell.this.getNumber();
}else {
Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
Timer timer = new Timer(2000, new ActionListener(){
public void actionPerformed(ActionEvent e){
Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].setNumber(0);
Sudoku.displayArray[Sudoku.getLastX()][Sudoku.getLastY()] = 0;
}
});
timer.start();
if (Sudoku.sudoku[Sudoku.getLastX() / 3][Sudoku.getLastY() / 3].grid[Sudoku.getLastX() % 3][Sudoku.getLastY() % 3].getNumber() == 0){
timer.stop();
}
}

}
}
else if(Cell.this.getBelongsToQuestionsPart()){
if(CustomizedSudoku.getSiteSelected()){
//重复与否判断
if (!Cell.this.isRepeated(Cell.this.getNumber())){
CustomizedSudoku.custom[CustomizedSudoku.getLastX()][CustomizedSudoku.getLastY()] = Cell.this.getNumber();
CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
}else {
CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(Cell.this.getNumber());
Timer timer = new Timer(2000, new ActionListener(){
public void actionPerformed(ActionEvent e){
CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].setNumber(0);
}
});
timer.start();
if (CustomizedSudoku.sudoku[CustomizedSudoku.getLastX() / 3][CustomizedSudoku.getLastY() / 3].grid[CustomizedSudoku.getLastX() % 3][CustomizedSudoku.getLastY() % 3].getNumber() == 0){
timer.stop();
}
}

}
}
//**********尚未:如果点了提示,则在小面板中标出可行的数字
}

public void mouseEntered(MouseEvent e){
Cell.this.setEnter(true);
}
public void mouseExited(MouseEvent e){
Cell.this.setEnter(false);
repaint();
}
}

protected boolean isRepeated(int number){
int x = 0, y = 0;

if(this.getBelongsToAnswersPart()){
x = Sudoku.getLastX() / 3;
y = Sudoku.getLastY() / 3;

for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
//检查同格
if (Sudoku.sudoku[x][y].grid[i][j].getNumber() == number){
return true;
}
//检查同列
if (Sudoku.sudoku[x+i][y].grid[Sudoku.getLastX() % 3][j].getNumber() == number){
return true;
}
//检查同行
if (Sudoku.sudoku[x][y+i].grid[j][Sudoku.getLastY() % 3].getNumber() == number){
return true;
}
}
}
}

if(this.getBelongsToQuestionsPart()){
x = CustomizedSudoku.getLastX() / 3;
y = CustomizedSudoku.getLastY() / 3;

for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
//检查同格
if (CustomizedSudoku.sudoku[x][y].grid[i][j].getNumber() == number){
return true;
}
//检查同列
if (CustomizedSudoku.sudoku[x+i][y].grid[CustomizedSudoku.getLastX() % 3][j].getNumber() == number){
return true;
}
//检查同行
if (CustomizedSudoku.sudoku[x][y+i].grid[j][CustomizedSudoku.getLastY() % 3].getNumber() == number){
return true;
}
}
}
}

if(number == 0){
return false;
}
return false;
}
}


Grid类:
public class Grid extends JPanel{		
Cell[][] grid = new Cell[3][3];

public Grid() {
this.setOpaque(false);
this.setPreferredSize(new Dimension(122, 122));
this.setLayout(new GridLayout(3, 3, 1, 1));
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
grid[i][j] = new Cell();
this.add(grid[i][j]);
}
}
}
}


应该是这两个里面哪个地方出问题了。。
focusforce 2010-01-15
  • 打赏
  • 举报
回复
上相关全部代码吧。
xxxadi 2010-01-15
  • 打赏
  • 举报
回复
请问有人知道么。。我觉得应该是paintComponent方法里有问题。。但不知道具体是什么出了问题??
xiaohuanjie 2010-01-14
  • 打赏
  • 举报
回复
不会,帮顶
xxx_di 2010-01-14
  • 打赏
  • 举报
回复
呜..请问有人知道么~

62,621

社区成员

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

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