2012-05-17 9 views
0

Я пытаюсь создать доску для игры, сначала создаю кадр, если пользователь // вводит строки и столбцы в виде чисел и нажимает кнопку запуска, он должен удалить все// Что на раме и добавить панель с макетом сетки, имеющими кнопки вездеСоздание панели кнопок GUI

Вот код (Проблема кадр очищается и ничего не появляется)

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class Frame extends JFrame implements ActionListener{ 
    private static final long serialVersionUID = 1L; 


    JButton newButton; 
    JButton Start; 
    JTextArea row; 
    JTextArea col; 
    JLabel background; 
    JLabel rows; 
    JLabel columns; 
    JLabel Error; 
    JPanel myPanel; 
    JCheckBox box; 


    public Frame() 
    { 
       //adding frame 


       setTitle("DVONN Game"); 
      setSize(1000, 700); 
      setVisible(true); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setLayout(null); 
     //making start button 
     Start = new JButton(new ImageIcon("Start")); 
     Start.setBounds(500, 30, 300, 300); 
     Start.setOpaque(true); 
     Start.addActionListener(this); 

      //make background 
     background = new JLabel(); 
     background.setBounds(0, -300, 2000, 1500); 
     background.setIcon(Color.BLUE)); 

     rows = new JLabel("Enter the rows"); 
     columns = new JLabel("Enter the columns"); 
     rows.setForeground(Color.WHITE); 
     columns.setForeground(Color.WHITE); 
     rows.setBounds(10,10,100,30); 
     columns.setBounds(10,45,105,30); 

     row = new JTextArea(); 
     col = new JTextArea(); 
     row.setBounds(120,10,100,30); 
     col.setBounds(120,45,100,30); 

     Error = new JLabel("Enter numbers plz!"); 
       Error.setBounds(10, 100, 400, 30); 
     Error.setForeground(Color.RED); 
     Error.setVisible(true); 

     box = new JCheckBox("Enable Random Filling"); 
     box.setBounds(10, 200, 150, 20); 
     box.setVisible(true); 

     myPanel = new JPanel(); 
     myPanel.setBounds(30, 30, 700, 500); 
     myPanel.setVisible(true); 

     newButton = new JButton(); 
     newButton.setOpaque(true); 

     getContentPane().add(box); 
     getContentPane().add(rows); 
     getContentPane().add(columns); 
     getContentPane().add(row); 
     getContentPane().add(col); 
     getContentPane().add(Start); 
     getContentPane().add(background); 

     this.validate(); 
     this.repaint(); 

    } 


    public static void main(String[]args) 
    { 
     new Frame(); 
    } 

     //adding actions for start button 


     public void actionPerformed(ActionEvent e) { 

     boolean flag = true; 
     String r1 = row.getText(); 
     String c1 = col.getText(); 
     int x = 0,y = 0; 

     try{ 
      x = Integer.parseInt(r1); 
      y = Integer.parseInt(c1); 
     } catch(NumberFormatException l) { 
      flag = false; 
     } 

     int size = x * y; 

     if (flag == true) { 
      this.getContentPane().removeAll(); 
      this.validate(); 
      this.repaint(); 

      myPanel.setLayout(new GridLayout(x, y)); 

      while(size != 0) 
      { 
       myPanel.add(newButton); 
       size --; 
      } 

      this.getContentPane().add(myPanel); 

     } else { 

      this.getContentPane().add(Error); 
     } 
    } 
} 
+0

http://sscce.org/ –

+1

СРЮ плз изменить Start = новый JButton (новый ImageIcon ("Start")); в Start = new JButton («Старт»); и изменить background.setIcon (Color.BLUE)); - background.setBackground (Color.BLUE); –

ответ

1

вызова validate() и repaint()после новой элементы были добавлены вместо того, чтобы старые были удалены.

Вам не нужно называть setVisible() по отдельным компонентам, назовем его после pack() на самой раме, и вы не должны использовать validate() и repaint() в конструкторе. То есть, замените их на:

pack(); 
setVisible(true); 

или вы можете сделать это на объекте после вызова конструктора.

0

Попробуйте заменить

public static void main(String[]args) 
{ 
    new Frame(); 
} 

по

public static void main(String[]args) 
{ 
    new Frame().setVisible(true); 
} 
+0

Очевидно, что рамка уже видна, если у ОП возникает проблема с действием кнопки. – delicateLatticeworkFever

0

Удалить вызов this.setVisible в конструкторе и сделать это ваш основной метод.

public static void main(String[] args) { 
    final Frame fr = new Frame(); 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      fr.setVisible(true); 
     } 
    }); 
} 

Это гарантирует, что элементы рамы будут установлены до того, как они станут видимыми.

+0

это не вызовет проблему OP tho;) – delicateLatticeworkFever

+0

@goldilocks Извините, я не видел, что ему не хватает метода 'pack()'. –

2

Есть несколько проблем с этим кодом

  1. Является ли это действительно необходимо, чтобы получить возможность отправлять что много кода. Простой пользовательский интерфейс с одной кнопкой для нажатия, а затем еще один компонент, который должен появиться, будет достаточным для SSCCE
  2. Использование макета null. Пожалуйста, научитесь использовать LayoutManager s
  3. Каждый компонент Swing может содержаться только один раз в иерархии. Так что этот цикл не имеет смысла, так как вы добавляете тот же компонент снова и снова (не говоря уже о том, что отрицательный размер может привести к бесконечной петле)

    while(size != 0){ 
        myPanel.add(newButton); 
        size --; 
    } 
    
  4. Вы пробовали отладки, чтобы увидеть ли size на самом деле >0. Так как вы молча игнорируете ParseException s, вы можете получить size из 0, который очистит область содержимого и не добавит ничего
  5. Затем сделайте так, как предлагает окунь и позвоните validate после добавления компонентов. См. Javadoc метода Container#add

    Этот метод изменяет информацию, относящуюся к компоновке, и, следовательно, делает недействительной иерархию компонентов. Если контейнер уже был отображен, иерархия должна быть проверена после этого, чтобы отобразить добавленный компонент.

+0

спасибо за предложения, что касается 3-го замечания, я хотел добавить ту же кнопку для всей сетки (панели), как вы предлагаете мне это сделать? –

+0

@OmarKhaled Вы не можете. Вам нужно будет создать несколько кнопок. Обратите внимание, что вы можете разделить действие (или actionlistener) за этими кнопками, хотя – Robin

+0

hmm Могу ли я создать новую кнопку в цикле и добавить ее в панель? –

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