簡體   English   中英

更新GUI面板,Java

[英]Updating a GUI panel, Java

我是Java GUI的初學者,在使面板更新所需的方式時遇到了一些麻煩。 基本上,當用戶單擊我的GUI中的按鈕之一時,當前顯示在屏幕上的形狀應更改為與按鈕按下相對應的任何形狀。 我的代碼如下。 更新后的形狀在可以顯示之前被原始形狀覆蓋的問題。

我很確定問題出在我的ButtonListeners上。 我添加了打印語句,以查看何時調用了不同的繪制方法,這是單擊一個按鈕后的結果:

RECT RECT RECT ddd橢圓形

顯然更新正在進行中,但是隨后將被原始形狀覆蓋! 有人可以告訴我為什么發生最后的覆蓋嗎?

我已經包含了供參考的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);
     }
 }

謝謝您的幫助!

我可以提出兩個可能的原因。

  1. 調用canvas.revalidate(); canvas.repaint();之前canvas.repaint(); 更新布局。
  2. 檢查用於繪制面板內容的顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM