2015-09-16 66 views
0

我剛剛開始使用JAVA,我試圖用輸入來繪製圖像。 當我給出一個新值並點擊按鈕「draw」時,我希望面板「刷新/重新加載」。 我嘗試了所有不同的方式removeALL();重繪();一個revalidate();在不同的地方。rapaint();繪製後立即重繪

with removeAll();窗戶凍結。 with only repaint();並重新驗證();圖像只停留一秒鐘。

我希望圖像保持,直到一個新的值得到充分和按鈕被點擊。 放下她是代碼的一部分。 謝謝。

public void actionPerformed (ActionEvent event) { 
    Graphics paper = panel.getGraphics(); 

    String input = field.getText(); 
    String input2 =field2.getText(); 
    int x = Integer.parseInt(input); 
    int y = Integer.parseInt(input2); 

    paper.setColor(Color.red); 
    paper.fillOval(x, y, 50, 50); 

    paper.setColor(Color.blue); 
    paper.fillOval((x+100), y, 35, 35); 

    paper.setColor(Color.blue); 
    paper.fillOval(x, (y+100), 35, 35); 

    paper.setColor(Color.black); 
    paper.drawLine((x+49), (y+25), (x+102), (y+20)); 

    paper.setColor(Color.black); 
    paper.drawLine((x+25), (y+49), (x+20), (y+102)); 

    //removeAll(); 
    //revalidate(); 
    //repaint(); 
} 

我嘗試在不同的功能:

public void actionPerformed (ActionEvent event) { 
    Graphics paper = panel.getGraphics(); 
    function(paper); 
    repaint(); 
    revalidate(); 
} 

public void function (Graphics paper){ 
.... } 

沒有工作..

+1

通常情況下,你應該重新定義:'公共無效漆(圖形G){...}'只有調用'重繪();'在'的actionPerformed(...)' – Servuc

+1

覆蓋paintComponent()並使用作爲參數傳遞的Graphics對象,而不是嘗試在ActionListener內繪製。 – WillShackleford

+2

如果要離線準備圖像,請將其繪製到BufferedImage,然後在面板的[繪圖(圖形)]中繪製該圖像(http://docs.oracle.com/javase/7/docs/api/javax/ swing/JComponent.html#paint(java.awt.Graphics))方法。 – BeyelerStudios

回答

3

不要叫panel.getGraphics()從重寫paintComponents方法得到它。就像這樣:

public class MyJFrame extends JFrame { 

    final JTextField field; 
    final JTextField field2; 
    final JButton btn; 
    final MyJPanel panel; 

    public MyJFrame() { 
     setLayout(new FlowLayout()); 
     field = new JTextField("10"); 
     add(field); 
     field2 = new JTextField("10"); 
     add(field2); 
     btn = new JButton("paint"); 
     add(btn); 
     panel = new MyJPanel(); 
     panel.setPreferredSize(new Dimension(200, 200)); 
     add(panel); 
     btn.addActionListener(e -> { 
      panel.repaint(); 
     }); 
     pack(); 
    } 

    class MyJPanel extends JPanel { 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics paper = g; 
      String input = field.getText(); 
      String input2 = field2.getText(); 
      int x = Integer.parseInt(input); 
      int y = Integer.parseInt(input2); 

      paper.setColor(Color.red); 
      paper.fillOval(x, y, 50, 50); 

      paper.setColor(Color.blue); 
      paper.fillOval((x + 100), y, 35, 35); 

      paper.setColor(Color.blue); 
      paper.fillOval(x, (y + 100), 35, 35); 

      paper.setColor(Color.black); 
      paper.drawLine((x + 49), (y + 25), (x + 102), (y + 20)); 

      paper.setColor(Color.black); 
      paper.drawLine((x + 25), (y + 49), (x + 20), (y + 102)); 
     } 

    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(() -> { 
      new MyJFrame().setVisible(true); 
     }); 
    } 
}