gpt4 book ai didi

java - 如何获得与网格布局内联的 jpg

转载 作者:行者123 更新时间:2023-12-01 14:56:51 26 4
gpt4 key购买 nike

我相信这很简单,也许我只是以不同的方式看待它,我有一张普通战舰布局的 jpg,我还有一个用 Jpanel 完成的实际网格,为了使我的游戏更加奇特,我希望让 jpanel 的网格覆盖 jpeg,使其看起来更真实。当我导入 jpeg 时,它将图像放置在每个网格中。这是可以理解的,我创建了一个网格类的新实例。 6×6

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class Grid extends JPanel {
private int row;
private int column;
BufferedImage img;

private BattleShipsClient parent;
public Grid(int row , int column, BattleShipsClient gui)
{
this.row = row;
this.column = column;
this.parent = gui;

setBorder(new LineBorder(Color.black,1));
addMouseListener(new ClickListener());
/*
try {
img = ImageIO.read(new File("Battleships.jpg"));
} catch (IOException e) {
}*/
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
//g.drawImage(img, 0, 0, null);
}
private class ClickListener extends MouseAdapter
{

}


}

这是我的网格类,导入图像的代码已被注释掉,因为它在这个地方不起作用

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;


public class BattleShipsClient implements Runnable, BattleShipConstants{
//6 rows and 6 collunms
private Grid [][] grid = new Grid[6][6];

private DataInputStream fromServer;
private DataOutputStream toServer;
BufferedImage img;
JFrame j = new JFrame();

public BattleShipsClient()
{
JPanel p = new JPanel();
p.setLayout(new GridLayout(6,6,0,0));
for (int i=0;i<6;i++)
for(int j=0;j<6;j++)
p.add(grid[i][j] = new Grid(i,j,this));

p.setBorder(new LineBorder(Color.black,1));

j.add(p,BorderLayout.CENTER);
j.setSize(320,320);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setVisible(true);



}
public void run(){
Thread thread = new Thread(this);
thread.start();
}
public static void main(String [] args){
BattleShipsClient bs = new BattleShipsClient();
}


}

我意识到为什么它不起作用,但似乎无法弄清楚我将如何让它工作,以便它与网格内联。

最佳答案

您可能知道它不起作用(内联图像)的原因是您添加了 6 x 6 (36) Grid JPanels,其中每个都是绘制战列舰的单独图像。您需要的是绘制单个图像并将各个单元覆盖在顶部。

实现此目的的一种方法是创建另一个仅绘制图像的自定义 JPanel,然后将您的 Grid 面板添加到其中:

class ImagePanel extends JPanel {
private final BufferedImage img;

public ImagePanel() throws IOException {
setLayout(new GridLayout(6, 6));
img = ImageIO.read(new File("Battleships.jpg"));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
}
}

最后一个重要提示:不要忘记打电话

setOpaque(false);

在每个Grid面板中使每个单元格透明。这将允许显示父容器中的图像。

关于java - 如何获得与网格布局内联的 jpg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com