2015-04-24 2 views
-1

Я пытаюсь добавить кнопки в центральную панель, которую я создал, затем добавьте эту панель к основному центру borderlayout. по какой-то причине, хотя моя вкладка больше не перекрашивается. Это сработало хорошо, когда у меня был класс DrawFieldsListener в том же файле класса, что и MagicSquare, но ничто в коде не изменилось из моего разбиения на два файла класса. Поэтому я действительно не знаю, что происходит. Когда он перерисовывался раньше, это также займет много времени. Любая помощь? благодаря!Почему repaint() не работает?

Все источник для проекта на GitHub, если это легче читать и понимать там: https://github.com/andrefecto/Academic-Convivium-Project

Магический Квадрат Класс:

package magicSquare; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class MagicSquare extends JPanel { 
    JLabel sizeLabel = new JLabel("Enter A Square Size: "); 
    JButton setSize; 
    static JButton calculate; 
    static JButton reset; 
    static JTextField squareSize; 
    static JTextField field; 

    public static ArrayList<JTextField> inputFields = new ArrayList<JTextField>(); 
    public static ArrayList<Integer> inputs = new ArrayList<Integer>(); 
    public static ArrayList<Integer> totals = new ArrayList<Integer>(); 

    public static int squared = 0; 
    public static int square = 0; 

    public static JPanel centerPanel = new JPanel(); 
    public static JPanel bottomPanel = new JPanel(); 

    public MagicSquare(){ 
     setLayout(new BorderLayout()); 
     JPanel subPanel = new JPanel(); 

     subPanel.add(sizeLabel); 

     squareSize = new JTextField(); 
     squareSize.setColumns(6); 
     subPanel.add(squareSize); 

     setSize = new JButton("Enter"); 
     subPanel.add(setSize); 
     setSize.addActionListener(new DrawFieldsListener()); 

     add(subPanel, BorderLayout.NORTH); 
     add(new DrawFieldsListener(), BorderLayout.CENTER); 
    } 
} 

мой DrawFieldsListener класс:

package magicSquare; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

class DrawFieldsListener extends JPanel implements ActionListener { 

    int square = MagicSquare.square; 
    int squared = MagicSquare.squared; 
    JPanel centerPanel = MagicSquare.centerPanel; 
    JTextField squareSize = MagicSquare.squareSize; 
    JTextField field = MagicSquare.field; 
    ArrayList<JTextField> inputFields = MagicSquare.inputFields; 
    JButton calculate = MagicSquare.calculate; 
    JButton reset = MagicSquare.reset; 
    JPanel bottomPanel = MagicSquare.bottomPanel; 

    public void actionPerformed(ActionEvent e){ 
     square = Integer.parseInt(squareSize.getText()); 
     squared = square*square; 

     centerPanel.setLayout(new GridLayout(square, square)); 

     for(int i = 0; i < squared; i++){ 
      field = new JTextField(); 
      field.setColumns(3); 
      inputFields.add(field); 
      centerPanel.add(inputFields.get(i)); 
      System.out.println("DRAWING"); 
     } 

     add(centerPanel, BorderLayout.CENTER); 
     System.out.println("ADDING ADDITINOAL BUTTONS"); 
     additionalButtons(); 
     System.out.println("ADDED ADDITINOAL BUTTONS"); 
     System.out.println("REPAINTING"); 
     repaint(); 
     System.out.println("REPAINTED"); 
    } 
    public void additionalButtons(){ 
     calculate = new JButton("Calculate"); 
     reset = new JButton("Reset"); 

     bottomPanel.setLayout(new GridLayout(2, 2)); 
     bottomPanel.add(reset); 
     bottomPanel.add(calculate); 

     add(bottomPanel, BorderLayout.SOUTH); 

     calculate.addActionListener(new CalculateListener()); 
     reset.addActionListener(new ResetListener()); 
    } 
} 
+2

Для лучшей помощи раньше, опубликовать [MCVE] (http://stackoverflow.com/help/mcve) (минимальная Полный Проверяемости пример) или [SSCCE] (HTTP: // WWW .sscce.org /) (Short, Self Contained, Correct Example). –

+1

'public static JPanel centerPanel = new JPanel();' пугает меня от меня ... особенно когда вы делаете 'JPanel centerPanel = MagicSquare.centerPanel;' ?! – MadProgrammer

+0

BTW - 'static', как правило, не является решением какой-либо проблемы, которую вы пытаетесь решить. –

ответ

3

Ошибка # 1

public static JPanel centerPanel = new JPanel(); 

Вслед за ...

class DrawFieldsListener extends JPanel implements ActionListener { 
    //... 
    JPanel centerPanel = MagicSquare.centerPanel; 

static не крест механизм объекта связи ... и теперь я понятия не имею, кто предполагают, чтобы нести ответственность за управление centerPanel ...

Помните, static не является вашим другом, остерегайтесь того, как он используется

Ошибка № 2

setSize.addActionListener(new DrawFieldsListener()); 

add(subPanel, BorderLayout.NORTH); 
add(new DrawFieldsListener(), BorderLayout.CENTER); 

Вы создаете два экземпляра DrawFieldsListener (который представляет собой панель), один действует как ActionListener и один действует как вид, но на самом деле один корпус MagicSquare.centerPanel как компонент может иметь только один из родителей ...

Ошибка № 3

Не повторный съем контейнера после того, как вы изменили его ...

public void actionPerformed(ActionEvent e) { 
     square = Integer.parseInt(squareSize.getText()); 
     squared = square * square; 

     centerPanel.setLayout(new GridLayout(square, square)); 

     for (int i = 0; i < squared; i++) { 
      field = new JTextField(); 
      field.setColumns(3); 
      inputFields.add(field); 
      centerPanel.add(inputFields.get(i)); 
      System.out.println("DRAWING"); 
     } 

     add(centerPanel, BorderLayout.CENTER); 
     System.out.println("ADDING ADDITINOAL BUTTONS"); 
     additionalButtons(); 
     System.out.println("ADDED ADDITINOAL BUTTONS"); 
     System.out.println("REPAINTING"); 
     revalidate(); 
     repaint(); 
     System.out.println("REPAINTED"); 
    } 

качели ленив, когда дело доходит до управления контейнером, он предполагает, что вы хотите сделать несколько добавления или удаляет, поэтому он не будет обновлять макет иерархии контейнера, пока вы его не спросите чтобы, как операция может быть дорогим

Лучшее решение ...

изолят ответственность и предоставлять информацию для ваших объектов в отсоединена образом.

Например, DrawFieldsListener не должен заботиться о MagicSquare, но должен предоставить средство, посредством которого «какое-то тело» может сказать, сколько квадратов оно должно создать.

Squares

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class MagicSquare extends JPanel { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new MagicSquare()); 
       frame.setSize(400, 400); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    JLabel sizeLabel = new JLabel("Enter A Square Size: "); 
    JButton setSize; 
    private JSpinner squareSize; 
    JTextField field; 

    public MagicSquare() { 
     setLayout(new BorderLayout()); 
     JPanel subPanel = new JPanel(); 

     subPanel.add(sizeLabel); 

     squareSize = new JSpinner(); 
     subPanel.add(squareSize); 

     setSize = new JButton("Enter"); 
     subPanel.add(setSize); 
     DrawFieldsListener dfl = new DrawFieldsListener(); 
     setSize.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int gridSize = (int) squareSize.getValue(); 
       dfl.makeGrid(gridSize); 
      } 
     }); 

     add(subPanel, BorderLayout.NORTH); 
     add(dfl, BorderLayout.CENTER); 
    } 

    class DrawFieldsListener extends JPanel { 

     private JButton calculate; 
     private JButton reset; 

     private ArrayList<JTextField> inputFields = new ArrayList<JTextField>(); 
     private ArrayList<Integer> inputs = new ArrayList<Integer>(); 
     private ArrayList<Integer> totals = new ArrayList<Integer>(); 

     private int squared = 0; 
     private int square = 0; 

     private JPanel centerPanel = new JPanel(); 
     private JPanel bottomPanel = new JPanel(); 

     public void makeGrid(int gridSize) { 
      square = gridSize; 
      squared = square * square; 

      centerPanel.setLayout(new GridLayout(square, square)); 

      for (int i = 0; i < squared; i++) { 
       field = new JTextField(); 
       field.setColumns(3); 
       inputFields.add(field); 
       centerPanel.add(inputFields.get(i)); 
       System.out.println("DRAWING"); 
      } 

      add(centerPanel, BorderLayout.CENTER); 
      System.out.println("ADDING ADDITINOAL BUTTONS"); 
      additionalButtons(); 
      System.out.println("ADDED ADDITINOAL BUTTONS"); 
      System.out.println("REPAINTING"); 
      revalidate(); 
      repaint(); 
      System.out.println("REPAINTED"); 
     } 

     public void additionalButtons() { 
      calculate = new JButton("Calculate"); 
      reset = new JButton("Reset"); 

      bottomPanel.setLayout(new GridLayout(2, 2)); 
      bottomPanel.add(reset); 
      bottomPanel.add(calculate); 

      add(bottomPanel, BorderLayout.SOUTH); 

//   calculate.addActionListener(new CalculateListener()); 
//   reset.addActionListener(new ResetListener()); 
     } 
    } 
} 
+0

Если я не вызываю staticPanel static, то я не могу добавить никаких текстовых полей к нему. Также, если я не делаю centerPanel в классе MagicSquare, я не могу добавить его к текущему показующемуся центру borderlayout. Как я смогу удалить статику? Я ценю помощь, спасибо! –

+1

@ AndréFecteau Почему «MagicSquare» нуждается в доступе к любому из этих статических полей? Почему 'DrawFieldsListener' нуждается в доступе к любому из этих полей? Сосредоточьтесь на ограничении ответственности перед объектом, который действительно должен отвечать за эти области. Использовать методы и обратные вызовы для передачи информации между объектами – MadProgrammer

+1

Объекты должны быть жадными и защитными, они должны защищать информацию от модификации и просто предоставлять методы (в качестве затвора), чтобы поля были изменены только в том месте, в котором объект хочет их видеть. .. это одна из точек OO – MadProgrammer

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