有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Java缩放和显示图像的特定部分

所以我开始学习Java。 每一次Elipse的崩溃都让我更加后悔。 幸运的是,我实际上已经成功地让我自己设计的项目中的这一块真正“起作用”,但很明显,我是自学成才的,我确信我在布局和设计上犯了很多错误

总的来说,程序将创建一个JFrame,然后在其中插入一个JPanel(包装)的JscrollPane中粘贴一个JscrollPane。然后,它循环执行一个过程,该过程生成一个TMTile对象数组,这些对象是包含从jpg图像源文件夹中绘制的tile图像的扩展jpanel。完成后,它使用包装Jpanel中的GridBagLayout将该数组作为网格放置,从而形成一个漂亮的小迷宫

这一切都很完美,但最让人失望的是,用于创建瓷砖的图像的大小决定了一切。我一辈子都搞不懂如何缩放图像,努力寻找合适的过程只能让我找到创建新图像文件的方法,或者在拉伸和平铺图像之间交替,以适应其包含的组件,或者我无法遵循的建议来拯救我的生命

幸运的是。图像处理是TMTile类文件的一部分!这意味着我可以向您展示整个相关的脚本

导入以下内容以用于此文件

来自java。awt:颜色、GridBagConstraints、GridBagLayout、插图
来自javax。swing:ImageIcon、JLabel、JPanel

public class TMTile extends JPanel
{
private static final long serialVersionUID = 1L;

private int paths; // values 0 to 15, uses bitwise & | to set or check open paths

private JLabel tileWrap; // to contain the ImageIcon
private ImageIcon tileImg; // the image to be used

GridBagConstraints bag;

public TMTile( int inDir ) // called by maze constructor
{
    paths = inDir;
    this.setBackground( Color.RED ); // so I can tell if the image didn't load right
    this.setLayout( new GridBagLayout() ); // GridBagLayout is probably overkill but it what I am most familiar with now.

    bag = new GridBagConstraints();
    bag.insets = new Insets( 0, 0, 0, 0 );

    tileImg = tileImage( paths );

    tileWrap = new JLabel( "", tileImg, JLabel.CENTER );

    this.add( tileWrap, bag );
}


public void open( int inDir ) // called by maze constructor when tile value changes resulting from the perfect maze backtrack method
{
    paths = paths | inDir;

    tileImg = tileImage( paths );

    tileWrap.setIcon( tileImg );
}


private ImageIcon tileImage( int paths ) // created to cut down on duplicate code and make updating easier
{
    String inEnd;

    if(paths < 10)
    {
        inEnd = "0"+ paths;
    }
    else
    {
        inEnd = ""+ paths;
    }

    ImageIcon tileImg = new ImageIcon( "imgs/MAZE_"+ inEnd +".jpg" );

    System.out.println( "imgs/MAZE_"+ inEnd +".jpg" );

    Image newimg = tileImg.getImage().getScaledInstance( 40, 40, java.awt.Image.SCALE_DEFAULT );

    tileImg = new ImageIcon( newimg );

    return tileImg;
}


public int getOpen()
{
    return paths;
}
}

多亏了nachokk和MadProgrammer,我现在又一次拥有了一个可以工作的迷宫程序,而且迷宫瓷砖是可伸缩的。这就剩下了最终的目标,即取消单个瓷砖。jpgs并切换到单个图像文件,所有16个图像文件都存储在中

我想要的是能够利用单个大图像文件,该文件分为16个部分,每个瓷砖值1个部分。我开始朝着这个目标努力,但很快就放弃了,因为我不知道如何只显示所需的图像部分,这也需要以上述方式进行缩放

由于我仍在学习Java,所以欢迎提供关于任何替代方案的建议,但理想情况下,我希望知道如何按计划完成这项工作


共 (0) 个答案