Как решить для каждого не применимо к типу выражения? - PullRequest
0 голосов
/ 24 октября 2019

removePanel () используется для получения компонентов в mainPanel с использованием getComponent () и расширенного цикла. Затем проверьте, какие компоненты видимы, и вызовите removeLayoutComponent () для этого компонента.

ЭТО МЕТОД УДАЛЕНИЯ ПАНЕЛИ

public void removeJPanel () {
 for (Component comp : mainPanel.getComponent (number)) {
    if (comp.isVisible () == true) {
        card.removeLayoutComponent (comp);
        number++;
    } else {
      System.out.print("It didn't work!");
    }
 }
}

mainPanel использует макет карты, затем JPanels из массива panel добавляется в mainPanel.

Это код, где я создаю главную панель и добавляю JPANELS в нее

public TicTacToeFrame () {
 if (badge.num == 0) {
   playerX = JOptionPane.showInputDialog ("Enter Player X name: ");
   playerO = JOptionPane.showInputDialog ("Enter Player O name: ");
   badge.setLabel (playerX);
 }
   mainPanel = new JPanel ();//THIS IS WHERE I CREATE MAINPANEL
   mainPanel.setLayout (card);//THIS IS WHERE CARDLAYOUT IS SET AS LAYOUT MANAGER
   panels [0] = new JPanel (new GridLayout (3, 3, 0, 0));
   panels [1] = new JPanel (new GridLayout (3, 3, 0, 0));
   panels [2] = new JPanel (new GridLayout (3, 3, 0, 0));
   JPanelArray ();

   panels [0].setBorder (new LineBorder (Color.red, 1));
   panels [1].setBorder (new LineBorder (Color.red, 1));
   panels [2].setBorder (new LineBorder (Color.red, 1));

   mainPanel.add (panels [0], "one");//JPANELS FROM THE PANEL ARRAY ARE ADDED TO THE MAINPANEL
   mainPanel.add (panels [1], "two");
   mainPanel.add (panels [2], "three");

   badge.jlblStatus.setBorder (new LineBorder (Color.yellow, 1));

   add (mainPanel, BorderLayout.CENTER);
   add (badge.jlblStatus, BorderLayout.SOUTH);
}

Ожидаемый результат: игрок нажал кнопку JDialog и выполнил removePanel (). Вместо этого произошло то, что текущая панель не была удалена и произошла ошибка компиляции for-each not applicable to expression type.

ЭТО ТАМ, ГДЕ REMOVEJPANEL () ВЫЗВАН

public void replayDialog () {
   int response = JOptionPane.showConfirmDialog (this, "Do you want to play again ?", "TicTacToe", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
   if (response == JOptionPane.YES_OPTION) { 
       frame.removeJPanel ();
       frame.newCells = null;
       label.num++;
       frame.JPanelArray ();
   } else if (response == JOptionPane.NO_OPTION) {
        frame.gameOver = true;
   }     
}

Ошибка компиляции

.\TicTacToeFrame.java:139: error: for-each not applicable to expression type
     for (Component comp : mainPanel.getComponent (number)) {
                                              ^
 required: array or java.lang.Iterable
 found:    Component
1 error

Я обнаружил, что foreach не применим к типу выражения на этом сайте, но это нене отвечал моим потребностям, так как я изо всех сил пытался понять, что было на странице, так как я все еще новичок в Java.

1 Ответ

1 голос
/ 24 октября 2019

JPanel.getComponent(int) просто возвращает один компонент, который находится в том месте, где находится индекс, который вы передаете. Если вы хотите перебрать все компоненты в JPanel, вы можете использовать JPanel.getComponents, например:

public void removeJPanel () {
 Component[] components : mainPanel.getComponents();
 for (int i = 0; i < components.length; i++) {
    Component comp = components[i];
    if (comp.isVisible () == true) {
        card.removeLayoutComponent (comp);
        number++;
    } else {
      System.out.print("It didn't work!");
    }
 }
}
...