2013-09-21 7 views
0

Я делаю шашки в java, и кнопка «Новая игра» исчезает, когда я нажимаю на графический интерфейс. Он появляется, когда я наводил на него курсор мыши, но снова исчезает, если я нажму GUI. Вы знаете, что я сделал неправильно/делаю неправильно?JButton исчезает при нажатии GUI

public void setFrame() 
    { 
     boardSize = 10; 
     squareSize = 50; 
     int imageSize = boardSize * squareSize;  
     image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB); 
     imageIcon = new ImageIcon(image); 
     jLabel = new JLabel(imageIcon); 
     button = new JButton("New Game"); 
     button.setFocusable(false); 
     button.setBounds(375, 5, 100, 20); 
     pnl = new JPanel(); 
     pnl.setBounds(400, 10, 200, 100); 
     pnl.setLayout(null); 
     pnl.add(button); 

     jFrame = new JFrame("Checker Board"); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jFrame.add(jLabel, BorderLayout.CENTER); 
     jFrame.add(pnl); 
     jFrame.setSize(506, 558); 
     jFrame.setResizable(false); 
     jFrame.setLocationRelativeTo(null); 
     jFrame.setVisible(true); 

     jFrame.validate(); 
    } 

    /** 
    * Paint the checker board onto the Image. 
    */ 
    public void paint() 
    { 
     Graphics graphics = jFrame.getGraphics(); 

     pnl.paint(graphics); 
     button.paint(graphics); 

     graphics.setColor(Color.black); 
     Font font = new Font("Score", Font.BOLD, 20); 
     graphics.setFont(font); 
     graphics.drawString("Score: ", 150, 47); 
     graphics.drawString("Turn: ", 20, 47); 
     graphics.setFont(font.deriveFont(0, 16.0F)); 
     graphics.drawString("Red: " + Game.score.getScoreRed() + " Black: " + Game.score.getScoreBlack(), 230, 47); 
     graphics.drawString((Game.redTurn ? "Red" : "Black"), 80, 47); 

     // paint a red board 
     graphics.setColor(Color.red); 
     graphics.fillRect(xShift, zShift, boardSize * squareSize, boardSize * squareSize); 

     // paint the black squares 
     graphics.setColor(Color.black); 
     for (int row = 0; row < boardSize; row++) 
     { 
      for (int col = row % 2; col < boardSize; col += 2) 
      { 
       graphics.fillRect(row * squareSize + xShift, col * squareSize + zShift, squareSize, squareSize); 
      } 
     } 

     for(int i = 0; i < 10; i++) 
     { 
      for(int j = 0; j < 10; j++) 
      { 
       if(Game.board.pieces[i][j] != null) 
       { 
        Color pieceColor = Game.board.pieces[i][j].getColor().equals(EnumTeam.BLACK) ? Color.gray : Color.pink; 
        graphics.setColor(pieceColor); 
        graphics.fillOval((i * 50) + 10 + xShift, (j * 50) + 10 + zShift, 30, 30); 
        if(Game.board.pieces[i][j].isKing()) 
        { 
         pieceColor = Game.board.pieces[i][j].getColor().equals(EnumTeam.BLACK) ? Color.darkGray : Color.magenta; 
         graphics.setColor(pieceColor); 
         graphics.fillOval((i * 50) + 20 + xShift, (j * 50) + 20 + zShift, 10, 10); 
        } 
       } 
      } 
     } 

     graphics.setColor(Color.cyan); 
     drawRect(graphics, Game.board.getSelectedX(), Game.board.getSelectedZ(), 5); 
    } 
+0

Нам будет намного легче помочь вам, если вы публикуете только соответствующие части своего кода, например, как создается кнопка, события кликов на панели/кнопку/и т. Д. – gwin003

+0

1-й плохой подход 'pnl.setLayout (null);' попробуйте вызвать 'validate' после вызова' paint' и часто говорят, чтобы не рисовать в окнах, а не рисовать в контейнерах, переопределяя 'paintComponent' – nachokk

+0

Не используйте' Графическая графика = jFrame.getGraphics(); '! Это не так, как обычная картина выполняется в Swing. Дело в том, что вы – MadProgrammer

ответ

3

Не, никогда использование Graphics graphics = jFrame.getGraphics(); (или getGraphics вообще)! Это не так, как обычная картина выполняется в Swing. Тот факт, что вы очистили графический контекст, является вашей основной проблемой.

Все картины должно быть сделано в контексте картины API, предпочтительно путем переопределения paintComponent из любого компонента, который простирается JComponent (я, лично, предпочитаю JPanel)

Создание пользовательского компонента и использовать его это выполнить вас заказ картина. Разместите его вместе с другими компонентами на раме.

Комплект Performing Custom Painting и Painting in AWT and Swing для более подробной информации о том, как живопись работает в Swing.

MouseListener не очень подходящий слушателю использовать для кнопок, лучшим выбором будет использовать ActionListener, который принимает во внимание щелчками мыши и события клавиатуры ...

См How to write an Action Listener и How to use buttons для более подробной информации. ..

Смежные вопросы