2017-02-26 10 views
-1

数学関数のグラフを描くことができるスイングアプリケーションを開発していました。私はgetGraghics関数を使用していましたが、どのように削除して再描画するか分かりませんでしたので、paintComponent()メソッドをオーバーライドして探したいものを実装しました。ユーザーがボタンをクリックします。それはpaintCompnent()が動作していないようです。私は正確に既存のチュートリアルやスタックオーバフローに関する同様の質問に従ってきました。しかし、それらのどれも私のために働いていませんでした:(それはちょうど意味がありませんでした:(パネルに追加するとpaintComponent()が機能しません

私は一夜以上この問題を抱えて助けてください

以下は関数グラフを描画するためのコードですが、動作していないので、描画用の座標系の部分だけをテスト用に残した後、インスタンスを作成してパネルに追加しようとしたコードですメインクラス

class drawfunction extends JPanel{ 


@Override 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 


    g.setColor(Color.red); 
    g.drawLine(0, 200, 400, 200); 
    g.drawLine(200,0 , 200, 400); 


} 

}

は、メインクラスのコード

 JPanel panel = new JPanel(); 



    panel.setBounds(14, 104, 400, 400); 
    contentPane.add(panel); 

    panel.setBackground(Color.white); 

    JButton btnNewButton = new JButton("View the graph"); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 


      //a= Integer.parseInt(cofficient_a.getText()); 
      //b= Integer.parseInt(cofficient_b.getText()); 
      //c= Integer.parseInt(cofficient_c.getText()); 
      //d= Integer.parseInt(cofficient_d.getText()); 
      //e= Integer.parseInt(cofficient_e.getText()); 


     drawfunction a=new drawfunction(); 
     panel.add(a); 



    }); 

誰もが、私はこの問題を解決するために何をすべきかを教えてくださいすることができます。ありがとうございました !!!!

+1

さて、二つのこと、1 - パネルのデフォルトサイズは '0x0'と2である - スイングは怠け者である、あなたは' revalidate'と '再描画を呼び出す必要があります'あなたがUIを更新したいとき – MadProgrammer

+0

また、クラス名は大文字で始まるべきです! – camickr

+0

@MadProgrammer私はちょうどパネルのサイズを設定するためにsetPreferredSize()を使用しようとしており、これらの2つの関数を追加しようとしました。ボタンを押すたびに小さな空白の四角が表示されます。 –

答えて

2

2つの基本的な事柄...

  1. コンポーネント0x0のデフォルト好ましいサイズは、持っているので、ちょうど約すべてのレイアウトマネージャの制御下で、それにコンテナを追加するとき、それは0x0にサイズの取得(または非常になります閉じる)
  2. スイングは一般的に怠惰です。コンポーネントを追加または削除するとUIが更新されないため、パフォーマンスに支障をきたす可能性があります。代わりにUIがUIの更新を最もよく知らないためrevalidateに電話し、(ほとんどの場合)repaintにUIを更新する必要があります。

たとえば...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JPanel center; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      JButton btnNewButton = new JButton("View the graph"); 
      center = new JPanel(); 
      center.setPreferredSize(new Dimension(400, 400)); 
      add(center); 
      btnNewButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 

        remove(center); 

        //a= Integer.parseInt(cofficient_a.getText()); 
        //b= Integer.parseInt(cofficient_b.getText()); 
        //c= Integer.parseInt(cofficient_c.getText()); 
        //d= Integer.parseInt(cofficient_d.getText()); 
        //e= Integer.parseInt(cofficient_e.getText()); 
        center = new Drawfunction(); 
        add(center); 
        revalidate(); 
        repaint(); 

       } 

      }); 
      add(btnNewButton, BorderLayout.NORTH); 
     } 

     public class Drawfunction extends JPanel { 

      public Drawfunction() { 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(400, 400); 
      } 

      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.setColor(Color.red); 
       g2d.drawLine(0, 200, 400, 200); 
       g2d.drawLine(200, 0, 200, 400); 
       g2d.dispose(); 
      } 

     } 

    } 
} 
+0

私のUIはWindows Builder Proによって実際に設計されていて、他のものとは違うJframeの作成を行いました。あなたのコードは完璧に実行することができますが、私はまだあなたが言ったことはできませんでしたが、私はまだできません:( –

+0

問題はウィンドウビルダを使用しているため、ウィンドウビルダを掘り下げてUIビルドを開始する素敵な新しい機会があります。 – MadProgrammer

+0

ええ、良い計画のように聞こえる。あなたの答えをありがとう:) –

関連する問題