0

そこで、Java を学ぶことにしました。Elipse がクラッシュするたびに後悔する決定です。幸いなことに、私は実際に自分自身に課したプロジェクトのこのブロックを実際に「機能させる」ことができましたが、明らかに独学で、レイアウトに多くのエラーを犯したと確信しています。

全体として、プログラムは JFrame を作成し、その中に JscrollPane を貼り付けて、そこに JPanel (wrapPage) を挿入します。次に、jpg 画像のソース フォルダから描画されたタイル画像を含む拡張 JPanel である TMTile オブジェクトの配列を生成するプロセスをループします。それが完了すると、wrapPage Jpanel 内の GridBagLayout を使用してその配列をグリッドとして配置し、小さな完璧な迷路を作成します。

それはすべて完璧に機能しますが、大きな失望は、タイルの作成に使用される画像のサイズがすべてを決定していることです. 私は一生、画像をスケーリングする方法を理解できず、適切なプロセスを見つけるための努力は、新しい画像ファイルを作成する方法、または画像をストレッチとタイリングを交互に切り替えて、それらを含むコンポーネントまたは提案内に収まるようにする方法しか得られませんでした。私の命を救うために従うことができませんでした。

幸運。画像処理は TMTile クラス ファイルの一部です。これは、関連するスクリプト全体を表示できることを意味します。

以下は、このファイルで使用するためにインポートされます

java.awt から: Color、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 のおかげで、再び迷路プログラムが動作し、迷路タイルはスケーラブルになりました。個々のタイル .jpg を廃止し、16 個すべてが .jpg に格納された 1 つの画像ファイルに切り替えるという最終目標が残ります。

私が望んでいるのは、タイル値ごとに 1 つのセクションである 16 のセクションに分割された単一の大きな画像ファイルを利用する機能です。私はこの目標に向かって取り組み始めましたが、上記の方法でスケーリングする必要がある必要な画像のセクションのみを表示する方法を理解できなかったため、かなり早く放棄する必要がありました.

私はまだJavaのアドバイスを学んでいるので、代替手段についてのアドバイスは大歓迎ですが、理想的には、これを計画どおりに達成する方法を知りたいです.

4

0 に答える 0