【问题标题】:How to get a jpg inline with a grid layout如何使 jpg 与网格布局内联
【发布时间】:2013-01-09 21:11:57
【问题描述】:

我相信这很简单,也许我只是用不同的方式看待它,我有一个普通战舰布局的 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(); 
}


}

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

【问题讨论】:

    标签: java swing io jpanel jpeg


    【解决方案1】:

    您可能知道它不工作的原因(内联图像)是您添加了 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 面板中使每个单元格透明。这将允许显示父容器中的图像。

    【讨论】:

    • 谢谢你,但是我认为这没有按预期工作,或者我可能误解了你,网格不会变成内联这样做,或者图片无法呈现全尺寸并且网格不再是网格@雷默斯public ImagePanels(BattleShipsClient gui) { try { img = ImageIO.read(new File("Battleships.jpg")); for (int i=0;i&lt;6;i++) for(int j=0;j&lt;6;j++) add(grid[i][j] = new Grid(i,j,gui));
    • 您是否将您的布局设置为GridLayout(6,6) for ImagePanels?另请参阅更新。
    猜你喜欢
    • 2011-10-28
    • 2013-04-24
    • 2021-11-24
    • 2016-04-16
    • 1970-01-01
    • 2017-03-19
    • 2012-07-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多