2012-12-02 2 views
2

Я в основном новичок в использовании качания для начала. Так что медведь со мной здесь. Я могу сделать простой графический интерфейс с готовыми компонентами в библиотеке swing. Тем не менее, теперь у меня есть время, когда я пытаюсь понять, как рисовать основные фигуры на JPanel. В этом случае это набор объектов Square, которые я рекурсивно собрал и должен отображаться концентрически друг вокруг друга.Картина концентрических форм на JPanel или JComponent

Несколько недель назад мы сделали небольшой проект, включающий рисование фигур, за исключением того, что эти фигуры были нарисованы непосредственно на JFrame. Теперь, когда я пытаюсь сделать это в JPanel или классе, который расширяет JComponent, я сталкиваюсь с слишком большим количеством камней преткновения. На данный момент ничего не отображается на JPanel.

Вот классы, которые у меня есть до сих пор.

Квадратный класс. Это просто создает простой квадрат

public class Square 
{ 
    private int x, y, width, height; 
    private Color theColor; 

    public Square(int xS, int yS, int widthS, int heightS, Color squareColor) 
    { 
     x = xS; 
     y = yS; 
     width = widthS; 
     height = heightS; 
     theColor = squareColor; 
    } 

    public void draw(Graphics2D g2) 
    { 
     g2.setColor(theColor); 
     Rectangle rectDraw = new Rectangle(x,y,width,height); 
     g2.draw(rectDraw); 
    } 
} 

графического интерфейса пользователя Класс

public class SquareGUI extends JFrame 
{ 
    private JComboBox colorChoices, shapeChoices; 
    private JTextArea numberOfTimes; 
    private SquarePanel thisPanel; 

    public SquareGUI() 
    { 
     thisPanel = new SquarePanel(); 
     JPanel northPanel = new JPanel(new FlowLayout()); 
     setSize(640, 480); 
     setLayout(new BorderLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     ActionListener listener = new CommandListener(); 

     colorChoices = new JComboBox(); 
     shapeChoices = new JComboBox(); 
     numberOfTimes = new JTextArea(1,3); 
     colorChoices.addItem("Black"); 
     colorChoices.addItem("Blue"); 
     colorChoices.addItem("Red"); 
     colorChoices.addItem("Green"); 
     shapeChoices.addItem("Square"); 
     shapeChoices.addItem("Circle"); 

     colorChoices.addActionListener(listener); 
     shapeChoices.addActionListener(listener); 



     northPanel.add(colorChoices); 
     northPanel.add(shapeChoices); 
     northPanel.add(new JLabel("Number of Shapes:")); 
     northPanel.add(numberOfTimes); 
     add(northPanel, BorderLayout.NORTH); 

     add(thisPanel, BorderLayout.CENTER); 

     setVisible(true); 
    } 

    public void addShapesRecursively(int x, int y, int width, int height, int times) 
    { 
     if (times == 0) { return; } 
     Color colorChoice = null; 
     switch (colorChoices.getSelectedIndex()) 
     { 
      case 0: colorChoice = Color.BLACK; break; 
      case 1: colorChoice = Color.BLUE; break; 
      case 2: colorChoice = Color.RED; break; 
      case 3: colorChoice = Color.GREEN; break; 
     } 
     if (shapeChoices.getSelectedIndex() == 0) 
      thisPanel.add(new Square(x, y, width, height, colorChoice)); 
     else 
      System.out.println("todo"); 

     addShapesRecursively(x-15, y-15, width + 15, height + 15, times - 1); 
    } 

    class CommandListener implements ActionListener 
    { 

     @Override 
     public void actionPerformed(ActionEvent arg0) 
     { 
      addShapesRecursively(getWidth()/2,getHeight()/2,20,20,Integer.parseInt(numberOfTimes.getText())); 
     } 

    } 

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

И мой класс JPanel, который должен отображать квадратики.

public class SquarePanel extends JPanel 
{ 

    private ArrayList<Square> squareList; 
    public SquarePanel() 
    { 
     setBackground(Color.WHITE); 
     squareList = new ArrayList<Square>(); 

    } 

    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 

     for (int i = 0; i < squareList.size(); i++) 
     { 
      Square tempSquare = squareList.get(i); 
      tempSquare.draw(g2); 
     } 
    } 

    public void add(Square addSquare) 
    { 
     squareList.add(addSquare); 
    } 
} 

Я извиняюсь, что комментариев пока нет. Просто потянул мои волосы, пытаясь заставить это работать. Я знаю, что рекурсивный бит работает, потому что в этом ArrayList есть x количество объектов Square после его запуска. Это просто проблема рисования этих квадратов на JPanel.

Я пробовал это сначала с отдельного класса, который расширил JComponent, но никогда не мог заставить переопределенный paintComponent когда-либо срабатывать в нем. Поэтому я огляделся и узнал, что вы можете переопределить paintComponent в JPanel. Так что он стреляет, как ожидалось, но ничего не появляется на самом JPanel.

Мой общий вопрос: как мне получить квадраты для отображения правильно?

+1

первое предположение было бы, что метод компонент краски должен быть публичным, не защищены – schippi

+1

Используйте '@ Override', чтобы быть уверенным, и обратитесь к этому [ответ] (http://stackoverflow.com/a/13666281/230513). – trashgod

ответ

2

Вам необходимо поощрить панель к ее обновлению.

Добавьте вызов repaint в add методом панели ...

public void add(Square addSquare) { 
    squareList.add(addSquare); 
    repaint(); 
} 
+0

Спасибо. В конце концов, это было неправильно. Я уже перешел к простой программе рисования, которая рисует простые фигуры с помощью мыши. Делать гораздо лучше, чем раньше. –

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