2013-12-06 6 views
0

Я начинающий Java GUI, и у меня возникают проблемы с обновлением моих панелей, как я их хочу. В принципе, когда пользователь нажимает одну из кнопок в моем графическом интерфейсе, форма, отображаемая на экране, должна измениться до любой формы, соответствующей нажатию кнопки. Мой код ниже. Проблема в том, что обновленная форма перезаписывается исходной фигурой, прежде чем ее можно будет отобразить.Обновление панели графического интерфейса, Java

Я уверен, что проблема связана с моими ButtonListeners. Я добавил в операторах печати, чтобы увидеть, когда различные методы окраски в настоящее время называется, и это результат после того, как одна кнопка мыши:

RECT RECT RECT ддд OVAL RECT

Очевидно, что обновление происходит , но затем перезаписывается оригинальной формой! Может ли кто-нибудь сказать мне, почему эта заключительная перезапись происходит ?!

Я включил класс FigurePanel, который я использую для справки.

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

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

public class miniCADFrame extends JPanel { 

    private ButtonPanel buttons = new ButtonPanel(); 
    private CanvasPanel canvas = new CanvasPanel(); 

    public miniCADFrame() { 
     //Constructor, creates the mother panel 
     this.setLayout(new BorderLayout()); 
     this.add (canvas,BorderLayout.CENTER); 
    } 
    //******** BUTTONLISTENER************************ 
    private class ButtonListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent event) { //Paint the figure associated with the button click 
       canvas.add(new FigurePanel(FigurePanel.OVAL), BorderLayout.CENTER); 
       canvas.revalidate(); 
       canvas.repaint(); 
       System.out.println("ddd"); 

      } 
    } 

    private class ButtonPanel extends JPanel { 

     private JButton[] Jbuttons = new JButton[11]; 
     //Constructor 
     ButtonPanel() { 

      setLayout(new GridLayout(4, 4)); 

      // Create buttons to attach to the buttons panel 
      Jbuttons[0] = new JButton("Change Colour"); 
      Jbuttons[1] = new JButton("Up"); 
      Jbuttons[2] = new JButton("Text"); 
      Jbuttons[3] = new JButton("Left"); 
      Jbuttons[4] = new JButton("Enlarge"); 
      Jbuttons[5] = new JButton("Right"); 
      Jbuttons[6] = new JButton("Rectangle"); 
      Jbuttons[7] = new JButton("Down"); 
      Jbuttons[8] = new JButton("Circle"); 
      Jbuttons[9] = new JButton("Save"); 
      Jbuttons[10] = new JButton("Load"); 

      //Add the buttons to the buttons panel 
      for (int i=0; i<11; i++) { 
       Jbuttons[i].addActionListener(new ButtonListener()); 
       add(Jbuttons[i]); 
      } 
    } 
    } 

class CanvasPanel extends JPanel { 

     //Constructor 
     CanvasPanel() { 
      // Create "canvas" to hold a label for the buttons panel along with the button panel itself 
      this.setLayout(new BorderLayout()); 
      this.add(new JLabel("CONTROL PANEL"),BorderLayout.NORTH); 
      this.add(buttons, BorderLayout.WEST); //add the button panel to the canvas panel 

      //test 
      this.add(new FigurePanel(FigurePanel.RECTANGLE), BorderLayout.CENTER); 
     } 
} 
} 

Класс FigurePanel:

import java.awt.*; 
import javax.swing.JPanel; 

public class FigurePanel extends JPanel { 

    // Define constants 
    public static final int LINE = 1; 
    public static final int RECTANGLE = 2; 
    public static final int OVAL = 4; 

    private int type; 

    /** Construct a default FigurePanel */ 
    public FigurePanel() { 
    } 

    /** Construct a FigurePanel with the specified type */ 
    public FigurePanel(int type) { 
    this.type = type; 
    } 

    /** Draw a figure on the panel */ 
    protected void paintComponent(Graphics g) { 
     //Create blank canvas 
     super.paintComponent(g); 

     // Get the appropriate size for the figure 
     int width = getWidth();//width of the component 
     int height = getHeight();//height of the component 

     switch (type) { 
     case LINE: // Display a single line 
      g.drawLine(10, 10, width - 10, height - 10); 
      break; 
     case RECTANGLE: // Display a rectangle 
      g.drawRect((int)(0.1 * width), (int)(0.1 * height), 
      (int)(0.8 * width), (int)(0.8 * height)); 
      break; 
     case OVAL: // Display an oval 
      g.drawOval((int)(0.1 * width), (int)(0.1 * height), 
      (int)(0.8 * width), (int)(0.8 * height)); 
     } 
} 
     /** Set a new figure type */ 
     public void setType(int type) { 
     this.type = type; 
     } 

     /** Return figure type */ 
     public int getType() { 
     return type; 
     } 

     /** Specify preferred size */ 
     public Dimension getPreferredSize() { 
      return new Dimension(80, 80); 
     } 
} 

Наконец, вот мой кадр класс:

import java.awt.*; 

import javax.swing.*; 

public class miniCAD extends JFrame { 
    //Constructor for our extended frame class 

    public miniCAD() { 

    //Initialize our custom frame 
    miniCADFrame frame = new miniCADFrame();  

    add(frame, BorderLayout.CENTER); 

    } 

    /** Main method */ 
    public static void main(String[] args) { 
    miniCAD frame = new miniCAD(); 
    frame.setTitle("minCAD"); 
    frame.setSize(1000, 1000); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 
} 

Спасибо за помощь!

ответ

3

Я могу предложить две возможные причины.

  1. Позвонить canvas.revalidate(); до canvas.repaint(); обновить макет.
  2. Проверьте, какой цвет используется для рисования содержимого панели.
+0

+1 для revalidate() – camickr

+0

Это сработало! Вроде. Я добавил инструкцию печати для запуска каждый раз, когда вызывается один из методов рисования, и вот результат: RECT RECT RECT OVAL RECT – Adam

+0

Почему последний прямоугольник перезаписывает вещи !!? Argggggg – Adam

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