2016-05-31 10 views
0

Grundlegend habe ich ein JPanel mit einem GridLayout 5x5 und jedem "Quadrat" als JLabel mit einer Nummer und einer anderen Hintergrundfarbe, abhängig von der dort vorhandenen Nummer.Update Array von JLabels innerhalb eines JPanels mit GridLayout 5x5

Ich muss das Panel jedes Mal aktualisieren, wenn ich auf einen der Knöpfe (außer Menü eins) klicke, weil es das Array des Arrays von Ints ändert, wo ich die Zahlen bekomme, um die Etiketten zu setzen.

Meine Frage ist, wie aktualisiere ich jeden JLabel (einschließlich Farbe) JFrame Layout

public static JPanel painel(){ 
    novo_jogo(); 
    // Painel Grelha 
    JPanel grelha = new JPanel(); 
    GridLayout grid_grelha = new GridLayout(linhas, colunas, 3, 3); 
    grelha.setLayout(grid_grelha); 
    grelha.setOpaque(true); 
    grelha.setSize(janela_x - 140, janela_y-140); 
    grelha.setLocation(70, 20); 
    grelha.setBackground(Color.GREEN); 
    // criar JLabels 
    for (int num = 0; num < linhas; num++){ 
     for (int num2 = 0; num2 < colunas; num2++){ 
      JLabel label = new JLabel(); 
      label.setText(String.valueOf(tabuleiro[num][num2])); 
      label.setOpaque(true); 
      label.setBackground(select_cor(tabuleiro[num][num2])); 
      label.setHorizontalAlignment(SwingConstants.CENTER); 
      grelha.add(label); 
     } 
    } 
    return grelha; 

dies ist die Funktion, das gesamte Feld in den richtigen Gittern etc schafft ... (Dies wird auch in eine diferent Klasse, die vom Haupt

public class Board extends Game{....} 

meiner Idee erstreckt war die repaint() Funktion zu verwenden, nur das Panel mit dem Netz JPanel grelha = Board.painel(); und dannzu aktualisieren später war meine Idee, das Gitter (grelha) Panel nur zu aktualisieren, aber wenn ich dies tun:

/* Main */ 
public static void main(String[] args){ 
    frame.setTitle("Jogo 2048 em Java"); // Titulo da janela 
    frame.setSize(janela_x, janela_y); // Define o tamanho da janela 
    frame.setLocationRelativeTo(null); // Centraliza a janela no ecrã 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setBackground(Color.WHITE); 
    frame.setResizable(false); // Não deixa a janela ser aumentada 
    // Painel Fundo 
    JPanel fundo = new JPanel(); 
    fundo.setBackground(Color.WHITE); 
    // Painel Botões 
    JPanel botoes = new JPanel(); 
    GridLayout grid_botoes = new GridLayout(1, 5, 5, 5); 
    botoes.setLayout(grid_botoes); 
    botoes.setOpaque(true); 
    botoes.setSize(360, 50); 
    botoes.setLocation(70, 390); 
    botoes.setBackground(Color.WHITE); 
    JPanel grelha = Board.painel(); 
    // Botões e colocar no painel 
    JButton init = new JButton("Init"); 
    JButton left = new JButton("Left"); 
    JButton down = new JButton("Down"); 
    JButton right = new JButton("Right"); 
    JButton menu = new JButton("Menu"); 
    botoes.add(init); 
    botoes.add(left); 
    botoes.add(down); 
    botoes.add(right); 
    botoes.add(menu); 
    // Adicionar Panels à janela 
    frame.getContentPane().add(botoes); 
    frame.getContentPane().add(grelha); 
    frame.getContentPane().add(fundo); 
    frame.setVisible(true); 
    // ActionListener dos botões 
    ActionListener accao_botoes = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int n = -1; 
      if (e.getSource().equals(init)) n = 0; 
      else if (e.getSource().equals(left)) n = 1; 
      else if (e.getSource().equals(down)) n = 2; 
      else if (e.getSource().equals(right)) n = 3; 
      else n = 4; 
      switch (n){ 
       case 0: 
        Board.novo_jogo(); 
        Board.print(); 
        break; 
       case 1: 
        Board.esquerda(); 
        Board.print(); 
        break; 
       case 2: 
        Board.baixo(); 
        Board.print(); 
        break; 
       case 3: 
        Board.direita(); 
        Board.print(); 
        break; 
       case 4: 
        janela_menu(); 
        break; 
       } 
     } 
    }; 
    init.addActionListener(accao_botoes); 
    left.addActionListener(accao_botoes); 
    down.addActionListener(accao_botoes); 
    right.addActionListener(accao_botoes); 
    menu.addActionListener(accao_botoes); 
    while(true){ 
     frame.repaint(); 
     try{ 
      Thread.sleep(10); 
     }catch(Exception e){} 
    } 
} 

es das Panel aktualisieren tut, infact es tut nichts aktualisieren :( i grelha.validate tryed(), grelha.repaint() und nichts scheint zu funktionieren, fehlt mir irgendetwas?

Jeder kann mir helfen?

+0

erste - ich kann nicht siehe ' frame.setVisible (true); ' Sekunde - wenn Sie annehmen, den Rahmen zu aktualisieren? – krzydyn

+0

Ich aktualisierte den Code, um alle meine wichtigsten – PandaGOD82

+0

Im sollte die Etiketten jedes Mal zu aktualisieren, wenn ich auf eine der Tasten (außer Menü-Taste) klicken – PandaGOD82

Antwort

1
  1. Vorstand Instanz erstellen und aufzubewahren, auf dieses Objekt Board board=Board.painel();

  2. auf diese Instanz board.direita(); board.print();

  3. inplementataion von direita in Klasse Vorstand arbeiten sollte JLabel Eigenschaften ändern

  4. entfernen while(true) Schleife. EDT wird Swing-Widgets aktualisieren.

Beispiel direita (andere Umstellungen in ähnlicher Weise machen)

public void direita() { 
    if (currentX+1 < colunas) ++currentX; 
    JLabel label = labels[currentY][currentX]; 
    label.setBackground(Color.YELLOW); 
} 

Beispiel painel

public static Board painel(){ 
    // Painel Grelha 
    return new Board(); 
} 

und Board Konstruktor

public Board() { 
    GridLayout grid_grelha = new GridLayout(linhas, colunas, 3, 3); 
    setLayout(grid_grelha); 
    setOpaque(true); 
    setSize(janela_x - 140, janela_y-140); 
    setLocation(70, 20); 
    setBackground(Color.GREEN); 
    // criar JLabels 
    for (int num = 0; num < linhas; num++){ 
     for (int num2 = 0; num2 < colunas; num2++){ 
      JLabel label = new JLabel(); 
      //label.setText(String.format("%d,%d",num,num2)); 
      label.setOpaque(true); 
      label.setBackground(select_cor(num,num2)); 
      label.setHorizontalAlignment(SwingConstants.CENTER); 
      add(label); 
      labels[num][num2]=label; 
     } 
    } 
} 
+0

Board board = Board.painel(); erlaubt mir nicht, da painel ein JPanel zurückgeben, soll ich Brett zu einem JPanel ändern? oder ändern Sie den Rückgabetyp von pinel() in Board? – PandaGOD82

+0

auch, die Board.print ist nur eine textuelle Darstellung der Reihe von Ints, die ich im Moment habe: prntscr.com/bb0nk9 – PandaGOD82

+0

Wenn Sie sagen, "Einführung von Direita in Klasse Board sollte JLabel Eigenschaften ändern" Sie bedeuten, dass ich die Funktion "pinel()" auf der Funktion "direita()" auf der Platine ausführen muss? Entschuldigung, wenn ich sehr noob bin, es ist mein erstes Mal auf Swing:/ – PandaGOD82

Verwandte Themen