2

クラスの戦艦のクローンのボタンの配列を生成するのに問題があり、なぜ機能しないのかわかりません。どんなアドバイスでも役に立ちます... jFrameを作成するメインクラス、次にグリッドクラス、より具体的にはジェネレーターメソッドがボタンの配列を構築します。

import java.awt.*;

import javax.swing.*;

public class warship {

/**
 * @param args
 */

public static void main(String[] args) {
    JFrame gui = new JFrame();
    gui.setSize(700, 350);
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setLayout(new FlowLayout());
    grid oceanGrid = new grid();
    oceanGrid.Generator();
    gui.add(oceanGrid);
    gui.setVisible(true);

}

}

グリッド.java

     import java.awt.Dimension;
     import java.awt.GridLayout;
     import java.awt.LayoutManager;

     import javax.swing.ImageIcon;
     import javax.swing.JButton;
     import javax.swing.JPanel;
     import javax.swing.border.TitledBorder;


     @SuppressWarnings("serial")
public class grid extends JPanel{
private static int rows = 7;
private static int col = 10;

public void Generator(){

    ImageIcon wIcon = new ImageIcon    ("H:\\workspace\\Warship\\src\\images\\water.jpg");
    JPanel jPan1 = new JPanel();
    jPan1.setLayout((LayoutManager) new GridLayout(rows,col,1,1));
    jPan1.setSize(350,350);

    //Set Border 
    TitledBorder bdr = javax.swing.BorderFactory.createTitledBorder(null, "Targeting Grid",
            javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
            javax.swing.border.TitledBorder.DEFAULT_POSITION,
            new java.awt.Font("Arial", 0, 16));
    bdr.setTitleColor(java.awt.Color.RED);
    jPan1.setLayout((LayoutManager) new GridLayout(rows,col,1,1));      
    jPan1.setBorder(bdr);

    //Creates the array of buttons
    JButton b[]=new JButton[rows*col];
    for (int i = 0, j= rows*col; i < j; i++){
        b[i] = new JButton(wIcon);
        b[i].setSize(20, 20);
        b[i].setMaximumSize(new Dimension(20,20));
        b[i].setPreferredSize(new Dimension(20,20));
        System.out.println("loop test " + i);
        jPan1.add(b[i]);
    }
}
}
4

3 に答える 3

4

これはあなたが犯している間違いだと思います:
クラス grid extendsですが、ボタンを追加するJPanel別のクラスを宣言して初期化します。JPanelしたがって、実際にボタンをグリッドに追加するのではなく、使用しない別のパネルに追加します。

解決策は、この行を削除することです

JPanel jPan1 = new JPanel();

のすべての出現をjPan1置き換えるthis

このようにして、ボタンをグリッドに追加します。

于 2012-07-10T18:53:17.020 に答える
1

setVisible(true) の直前に pack() コマンドがないと思います。

于 2012-07-10T18:49:43.043 に答える
1

1 グリッド内の JPanel は不要です。
2 グリッド内の JPanel は、.add() メソッドを使用して何にも追加されません。
ただし、他の人はすでにこれに到達しているようです。

前述のとおり、「JPanel jPan1 = new JPanel();」という行を削除する必要があります。
「jpan1」という単語を置き換えます。「これ」という言葉で。すべて小文字。

これは、編集されたコードの正しいインデント、または少なくとも読みやすいものです。

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;


@SuppressWarnings("serial")
public class grid extends JPanel{
    private static int rows = 7;
    private static int col = 10;

    public void Generator(){

        ImageIcon wIcon = new ImageIcon ("H:\\workspace\\Warship\\src\\images\\water.jpg");

        this.setLayout((LayoutManager) new GridLayout(rows,col,1,1));
        this.setSize(350,350);

        //Set Border 
        TitledBorder bdr = javax.swing.BorderFactory.createTitledBorder(null,         "Targeting Grid",
            javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
            javax.swing.border.TitledBorder.DEFAULT_POSITION,
            new java.awt.Font("Arial", 0, 16));
        bdr.setTitleColor(java.awt.Color.RED);

        this.setLayout((LayoutManager) new GridLayout(rows,col,1,1));      
        this.setBorder(bdr);

    //Creates the array of buttons
        JButton b[]=new JButton[rows*col];
        for (int i = 0, j= rows*col; i < j; i++){
            b[i] = new JButton(wIcon);
            b[i].setSize(20, 20);
            b[i].setMaximumSize(new Dimension(20,20));
            b[i].setPreferredSize(new Dimension(20,20));
            System.out.println("loop test " + i);
                this.add(b[i]);
        }
    }
}

この時点以降は、少なくともスタイルに対する有益な批判であることに注意してください。

グリッドでコンストラクターを使用していたので、そのメソッドを呼び出す必要はありません。このような:

public Generator(){
    super();

    //code in Generator() here.
}

これで、「Generator()」メソッドを呼び出す必要がなくなりました

そしてこの2行

javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,

このように短くすることができます。

TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION,
于 2012-07-10T18:59:30.623 に答える