Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JButton在第一次启动前一直隐藏_Java_Eclipse_Swing_Jpanel_Jbutton - Fatal编程技术网

Java JButton在第一次启动前一直隐藏

Java JButton在第一次启动前一直隐藏,java,eclipse,swing,jpanel,jbutton,Java,Eclipse,Swing,Jpanel,Jbutton,注意,我发现了一个类似的帖子,但这个问题似乎一直存在这个问题,并没有真正解释为什么会出现这种情况,只是提供了一种替代方法 我正在创建一个Stratego游戏,现在我正在创建一个棋盘,玩家可以在棋盘上交换棋子,然后提交棋盘布局作为他们的军队出发地点 我在每个帧上都有一个JButton(每个播放器一个,第二个在第一个播放器提交并离开计算机后显示),第一个帧上的JButton仅在您将其悬停之前隐藏,但仅在Eclipse打开后程序第一次运行时才显示 有人能解释一下为什么会发生这种情况吗 主要的跑步课 L

注意,我发现了一个类似的帖子,但这个问题似乎一直存在这个问题,并没有真正解释为什么会出现这种情况,只是提供了一种替代方法

我正在创建一个Stratego游戏,现在我正在创建一个棋盘,玩家可以在棋盘上交换棋子,然后提交棋盘布局作为他们的军队出发地点

我在每个帧上都有一个JButton(每个播放器一个,第二个在第一个播放器提交并离开计算机后显示),第一个帧上的JButton仅在您将其悬停之前隐藏,但仅在Eclipse打开后程序第一次运行时才显示

有人能解释一下为什么会发生这种情况吗

主要的跑步课

LogicInterpreter logic = new LogicInterpreter();

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

    InputFrame inputPlayer1 = new InputFrame(logic, 1, "red", 600, 600);
    inputPlayer1.setLocation(dim.width / 2 - inputPlayer1.getSize().width/2,
            dim.height / 2 - inputPlayer1.getSize().height / 2);

    while(!logic.isSetUp1()){
        //Just to make it work
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //Now bring up board 2

    InputFrame inputPlayer2 = new InputFrame(logic, 2, "blue", 600, 600);
    inputPlayer2.setLocation(dim.width / 2 - inputPlayer2.getSize().width/2,
            dim.height / 2 - inputPlayer2.getSize().height / 2);

    while(!logic.isSetUp2()){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //Will eventually open the main board
    openBoards(logic);
}
这是输入帧的相关设置代码

public class InputFrame extends JFrame {

private static final long serialVersionUID = 1L;
private LogicInterpreter holder;
private Panel2 jp;
private int height, width;
private Map<Integer, ArrayList<Integer>> lakeCoords = new HashMap<>();
private List<Piece> pieces = new ArrayList<>();
private int playernumber;
private String playerColor;
Piece selectedPiece;
Piece secondSelectedPiece;
boolean hidePieces = false;

JButton submit = new JButton("SUBMIT");

public void addCoords() {
    lakeCoords.put(3, new ArrayList<Integer>(Arrays.asList(6, 5)));
    lakeCoords.put(4, new ArrayList<Integer>(Arrays.asList(6, 5)));
    lakeCoords.put(7, new ArrayList<Integer>(Arrays.asList(6, 5)));
    lakeCoords.put(8, new ArrayList<Integer>(Arrays.asList(6, 5)));
}

public void createPieces() {
    int y = 1;

    if (playernumber == 2) {
        y = 6;
    }

    List<Integer> openValues = new ArrayList<>();

    openValues.add(1);
    openValues.add(2);
    openValues.add(11);
    openValues.add(12);
    for (int x = 0; x < 2; x++) {
        openValues.add(3);
    }
    for (int x = 0; x < 3; x++) {
        openValues.add(4);
    }
    for (int x = 0; x < 4; x++) {
        openValues.add(5);
        openValues.add(6);
        openValues.add(7);
    }
    for (int x = 0; x < 5; x++) {
        openValues.add(8);
    }
    for (int x = 0; x < 8; x++) {
        openValues.add(9);
    }
    for (int x = 0; x < 6; x++) {
        openValues.add(10);
    }

    Collections.sort(openValues);
    for (int x = 1; x <= 10; x++) {
        for (int z = y; z <= 4; z++) {

            // 1x1 Marshal
            // 2x1 General
            // 3x2 Colonel
            // 4x3 Major
            // 5x4 Captain
            // 6x4 Lieutenant
            // 7x4 Sergeant
            // 8x5 Miner
            // 9x8 Scout
            // 10x6 Bomb
            // 11x1 Flag
            // 12x1 Spy

            Piece piece = new Piece(new Coords(x, z), openValues.get(0), playerColor);

            openValues.remove(0);
            pieces.add(piece);
        }
    }
}

public InputFrame(LogicInterpreter holder, int playerNumber, String playerColor, int height, int width) {
    this.height = height;
    this.width = width;
    playernumber = playerNumber;
    this.playerColor = playerColor;
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    addCoords();
    this.holder = holder;
    createPieces();
    jp = new Panel2(height, width);
    setResizable(false);
    jp.setBackground(new Color(235, 202, 158));
    setTitle("Player " + playerNumber + " Arrangement GUI     ||     Click Submit When Ready");
    jp.setPreferredSize(new Dimension(600, 600));
    jp.setLayout(null);
    jp.addMouseListener(new HandleMouse());
    getContentPane().add(jp);
    pack();
    setVisible(true);

    if(playernumber == 1)
        submit.setBounds(width / 10 * 4, height / 10 * 7, width / 10 * 2, height / 10 * 2);
    else
        submit.setBounds(width / 10 * 4, height / 10, width / 10 * 2, height / 10 * 2);
    submit.setFont(new Font("Arial", Font.BOLD, width * 20 / 600));
    submit.setBackground(Color.LIGHT_GRAY);
    submit.addActionListener(new CloseListener(this));
    jp.add(submit);
}

//More stuff down here about logic and stuff

public class Panel2 extends JPanel {

    private static final long serialVersionUID = 1L;
    int height = 0;
    int width = 0;

    public Panel2(int height, int width) {
        this.height = height;
        this.width = width;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int x = 0; x < width; x += width / 10) {
            for (int y = 0; y < height; y += height / 10) {
                boolean fill = false;
                for (Entry<Integer, ArrayList<Integer>> coords : lakeCoords.entrySet()) {
                    if ((coords.getKey() - 1 == x / 60 && coords.getValue().get(0) - 1 == y / 60)
                            || (coords.getKey() - 1 == x / 60 && coords.getValue().get(1) - 1 == y / 60)) {
                        fill = true;
                        break;
                    }
                }
                if (fill) {
                    g.setColor(Color.BLUE);
                    g.fillRect(x, y, width / 10, height / 10);
                    g.setColor(Color.BLACK);
                    g.drawRect(x, y, width / 10, height / 10);
                } else {
                    g.setColor(Color.BLACK);
                    g.drawRect(x, y, width / 10, height / 10);
                }
            }
        }

        if(hidePieces){
            for (Piece piece : pieces) {
                try {
                    g.drawImage(ImageIO.read(new File(playerColor + "_pieces/" + (playerColor.equals("blue") ? "Blue" : "Red") + "_Strat_Piece"
                            + ".png")), piece.getX() * width / 10 - width / 10,
                            piece.getY() * height / 10 - height / 10, width / 10, height / 10, null);
                } catch(Exception e){}
            }
        } else {
            for (Piece piece : pieces) {
                g.drawImage(piece.getImage(), piece.getX() * width / 10 - width / 10,
                        piece.getY() * height / 10 - height / 10, width / 10, height / 10, null);
            }

            if (selectedPiece != null) {
                g.setColor(Color.BLUE);
                g.drawImage(selectedPiece.getImage(), selectedPiece.getX() * width / 10 - width / 10,
                        selectedPiece.getY() * height / 10 - height / 10, width / 10, height / 10, null);
                g.drawRect(selectedPiece.getX() * width / 10 - width / 10,
                        selectedPiece.getY() * height / 10 - height / 10, width / 10, height / 10);
            }
        }
    }
}
公共类InputFrame扩展了JFrame{
私有静态最终长serialVersionUID=1L;
私人口译持有者;
私人小组2 jp;
私家车的高度、宽度;
private Map lakeCoords=新HashMap();
私有列表项=新的ArrayList();
私人int玩家编号;
私人弦乐演奏者彩色;
单件选择单件;
第二件选择第二件;
布尔hidePieces=false;
JButton submit=新JButton(“提交”);
public void addCoords(){
lakeCoords.put(3,新数组列表(Arrays.asList(6,5));
lakeCoords.put(4,新数组列表(Arrays.asList(6,5));
lakeCoords.put(7,新数组列表(Arrays.asList(6,5));
lakeCoords.put(8,新数组列表(Arrays.asList(6,5));
}
公共void createPieces(){
int y=1;
如果(playernumber==2){
y=6;
}
List openValues=new ArrayList();
增加(1);
增加(2);
openValues.add(11);
增加(12);
对于(int x=0;x<2;x++){
增加(3);
}
对于(int x=0;x<3;x++){
增加(4);
}
对于(int x=0;x<4;x++){
增加(5);
增加(6);
增加(7);
}
对于(int x=0;x<5;x++){
增加(8);
}
对于(int x=0;x<8;x++){
增加(9);
}
对于(int x=0;x<6;x++){
增加(10);
}
Collections.sort(openValues);

对于(int x=1;xSwing组件必须在EDT中创建。调用sleep()是EDT将阻止UI,这绝不是一个好主意。有关EDT的详细信息,请参阅此:

Swing组件必须在EDT中创建。调用sleep()是EDT将阻止UI,这绝不是一个好主意。有关EDT的详细信息,请参阅此:

第一帧上的JButton只有在您将其悬停之前才被隐藏,但只有在Eclipse打开后程序第一次运行时才被隐藏

这意味着您要在将所有组件添加到框架之前使框架可见

因此,基本逻辑的顺序是:

JPanel panel = new JPanel();
panel.add(...);
frame.add(panel);
frame.pack();
frame.setVisible(true);
第一帧上的JButton只有在您将其悬停之前才被隐藏,但只有在Eclipse打开后程序第一次运行时才被隐藏

这意味着您要在将所有组件添加到框架之前使框架可见

因此,基本逻辑的顺序是:

JPanel panel = new JPanel();
panel.add(...);
frame.add(panel);
frame.pack();
frame.setVisible(true);