簡體   English   中英

如何在調整面板大小時讓JPanel記住用戶繪制的圖形?

[英]How to get JPanel to remember user-drawn graphics when panel is resized?

我正在嘗試制作一個程序,允許用戶在員工上放置音樂筆記。 有一個名為SheetMusicPane的類擴展了JPanel,它從一堆從上到下繪制的人員開始。 通過單擊頂部工具欄中的按鈕,用戶可以選擇要繪制的注釋。 工具欄上還有一個按鈕,允許用戶增加可用的樂譜量(SheetMusicPane在JScrollPane中設置)。 當用戶調整SheetMusicPane的大小時,我不知道如何使音符復制。 然而,最初的員工仍然存在。

我嘗試了JPanel.repaint()方法; 它不起作用。

調整大小非常簡單:

JButton moreMusicButton = new JButton("Get More Sheet Music");
    tb.add(moreMusicButton);
    moreMusicButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           smp.setPreferredSize(new Dimension(scrollSize.width, smp.getHeight() +     moreMusicAmount));
           smp.repaint();
        }
    });

如上所述,repaint()沒有做任何事情。

提前致謝!

添加筆記繪圖代碼:

每個音符繪制按鈕都調用此方法(字符串“note”是從按鈕的ActionCommand獲得的):

  public void getShape(final Graphics g, final String note) {
     MouseListener[] listeners = this.getMouseListeners();
     for (MouseListener ml : listeners) {
        this.removeMouseListener(ml);  //makes graphics stop drawing previous note
     }
     this.addMouseListener(new MouseListener() {
        public void mousePressed(MouseEvent e) {
        }
        public void mouseReleased(MouseEvent e) {
        }
        public void mouseEntered(MouseEvent e) {
        }
        public void mouseExited(MouseEvent e) {
        }
        public void mouseClicked(MouseEvent e) {
           Point p = MouseInfo.getPointerInfo().getLocation();
           addShape(g, p.x, p.y, note);
           int pitch = 12;
           piano.playNote(pitch);
           advance(1.0, piano);
           try { addToFile(pitch, note);}
           catch(FileNotFoundException fnfe) {}
           catch(IOException ioe) {}
        }
     });
  }

這是面板本身的創建方式。 它包含一組私有嵌套類,它開始顯示簡單,無音符的樂譜。

私有類SheetMusicPane擴展JPanel {

  public SheetMusicPane() {
     final Graphics g = this.getGraphics();  
  } 

  //paints staffs
  public void paint(Graphics g) {
     super.paintComponent(g);
     for (int i = 0; (i - 1)*staffWidth < scrollSize.height + 100; i++) {
        int y = paddingNorth + i*staffWidth;
        Staff staff = new Staff(g, y, "treble");
     }
  }

  public void paintComponent(Graphics g) {
     super.paintComponent(g);
     for (String note : noteList) {
        addShape(g, 100, 200, note); 
     }
  }

  //takes in mouse info and calls addShape to draw notes on clicks
  public void getShape(final Graphics g, final String note) {  ... } //as shown above

  //draws a note
  private void addShape(Graphics g, int x, int y, String note) { ... }

  private void addToFile(int pitch, String note) throws FileNotFoundException, IOException { ...//adds note info to a file }

//此時只需要一個五線工作人員私人班級員工{

  private Graphics g;
  private int y;
  private int[] pitches;

  public Staff(Graphics g, int y, String cleff) {  ...//draws the lines }

}

您需要覆蓋Panel的paintComponent方法。 您可以將所有內容保存到Array(或List)中,並且paintComponent方法會繪制它們。 (在每次重畫上)。

如果在單擊時繪制它們,則下次調用repaint()時,將使用paintComponent方法清除並重新繪制Panel。 您的繪圖在Panel上的長度與reapaint()未被調用一樣長。

暫無
暫無

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

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