2011-12-30 5 views
1

検索を完了しましたが、このトリッキーな問題で一致した答えが表示されませんでした。JPanelのボタン内でJPanelを呼び出すことができません

ここで私は来る。あなたの助けを前もってありがとう。

actionlistenerを使用してJPanelのボタン内でJPanelを呼び出そうとしています。 追加した最初のボタンでうまくいきましたが、他の2つのボタンでは機能しません。 最初のボタンで呼び出されたjpanelsと残りの2番目のボタンの違いは、 最初のボタンが現在のJpanelから別のJpanelを呼び出していることです。他の2人は現在のJpanels内に2つのプライベートクラスのjpanelを呼び出すことを と呼びます。

私は何をしていますか: 2つのボタンを交換して同じJpanel内に2つの異なるチャートを表示しようとしています。プライベートjpanelsは純粋にチャートの描画に使用されます。私は に完全に新しいJPanelを作成せずに、これらの2つのjpanelを別のボタンで呼び出すだけで、チャートを描画する各jpanelを含み、最初のボタンの別のjpanelを呼び出すように呼び出す必要があると思いました。

私の扱いにくい言い回しについてお詫び申し上げます。コードがあります。

パブリッククラスExamPerfはJPanelのを拡張{

最終のJPanel viewPerf = TabbedQuiz.viewPerfPanel。

最終的なChartsPanel CP =新しいChartsPanel();

//コンストラクタにjpanelを構築しています。すべてのボタンはここにあります。

  public ExamPerf() { 
    setBackground(Color.BLACK); 

    setBounds(0, 0, 728, 380); 
    setLayout(null); 

    setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10)); 
    setBorder(BorderFactory.createTitledBorder(
      BorderFactory.createLineBorder(Color.ORANGE), 
      "Exam Performance", 0, 0, new Font("Tahoma", Font.BOLD, 15), 
      Color.WHITE)); 

    DrawCurrent drawarea=new DrawCurrent(); 
    add(drawarea); 

//これは全く別のクラスである別のJpanelを呼び出す最初のボタンです。

JButton backBut = new JButton("Main Menu"); 
    backBut.setFont(new Font("Tahoma", Font.BOLD, 11)); 
    backBut.setBounds(10, 24, 93, 23); 
    add(backBut); 
    backBut.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 

      setVisible(false); 
      invalidate(); 
      viewPerf.add(CP); 

     } 
    }); 

//これは第2のボタンです。私はプライベートクラスDrawCurrentを呼び出そうとしています。 //ただし、動作しません。

JButton histoPerf = new JButton("Historical Performance"); 
    histoPerf.setFont(new Font("Tahoma", Font.BOLD, 11)); 
    histoPerf.setBounds(122, 24, 161, 23); 
    add(histoPerf); 
    histoPerf.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      setVisible(false); 

      invalidate(); 

      DrawCurrent drawplace=new DrawCurrent(); 


      add(drawplace, BorderLayout.CENTER); 




     } 
    }); 

//これは第3ボタン、同じ問題です。

  JButton currentPerf = new JButton("Current Performance"); 
    currentPerf.setFont(new Font("Tahoma", Font.BOLD, 11)); 
    currentPerf.setBounds(303, 24, 151, 23); 
    add(currentPerf); 
    currentPerf.addActionListener(new ActionListener() { 
 @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 

      setVisible(true); 
      invalidate(); 

      DrawHistorical drawHis=new DrawHistorical(); 
      add(drawHis); 




     } 
    }); 

} 

//これは、DrawCurrent最初のプライベートクラスです。

パブリッククラスDrawCurrentはJPanelのを拡張{

public DrawCurrent() { 
     setBackground(Color.BLACK); 
     setForeground(null); 

     setBounds(10, 49, 708, 320); 

     setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10)); 
     setBorder(BorderFactory.createTitledBorder(
       BorderFactory.createLineBorder(Color.ORANGE), "Chart", 0, 
       0, new Font("Tahoma", Font.BOLD, 15), Color.WHITE)); 
     setLayout(null); 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     final Graphics2D canvas = (Graphics2D) g; 
     final BasicStroke Pen = new BasicStroke(4, BasicStroke.CAP_ROUND, 
       BasicStroke.JOIN_ROUND); 

     canvas.setStroke(Pen); 
     canvas.setColor(Color.LIGHT_GRAY); 
     canvas.drawLine(5, 315, 703, 315); 
     canvas.drawLine(getWidth()/2, 700, getWidth()/2, 19); 

     // write the names of columns on top of them; 
     canvas.setFont(new Font("Times New Roman", Font.BOLD, 13)); 
     canvas.drawString("Right", 50, 100); 
     canvas.drawString("Wrong", getWidth()/2 + 150, 300); 

     // draw two 3D rectangles as the columns of the performances; 
     // 
     canvas.fill3DRect(50, 100, 40, 215, true); 
     canvas.fill3DRect(getWidth()/2 + 150, 300, 40, 15, true); 

    } 

} 

//これは第2のプライベートクラス、DrawHistoricalです。

プライベートクラスDrawHistoricalはJPanelの{

final ArrayList<Integer> examCount=new ArrayList<>(); 

    final int leftEdge=10; 

    public DrawHistorical() { 
     setBackground(Color.BLACK); 
     setForeground(null); 

     setBounds(leftEdge, 49, 708, 320); 

     setBorder(BorderFactory.createLineBorder(Color.ORANGE, 10)); 
     setBorder(BorderFactory.createTitledBorder(
       BorderFactory.createLineBorder(Color.ORANGE), "Chart", 0, 
       0, new Font("Tahoma", Font.BOLD, 15), Color.WHITE)); 
     setLayout(null); 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     final Graphics2D canvas = (Graphics2D) g; 
     final BasicStroke Pen = new BasicStroke(2, BasicStroke.CAP_ROUND, 
       BasicStroke.JOIN_ROUND); 

     canvas.setStroke(Pen); 
     canvas.setColor(Color.LIGHT_GRAY); 
     canvas.setFont(new Font("Times New Roman", Font.BOLD, 13)); 

     //this loop is to draw the graph of the historical performance of completed exams. 
     for(int i=0; i<examCount.size();i=i+3){ 

      // write the number of exam on top of the lien graph. 

     canvas.drawString("Ex"+examCount.get(i).toString(), leftEdge+i, examCount.get(i)); 

      // draw the line graph and extends as long as the number of completed exams increases. 

     canvas.drawLine(leftEdge+2+i, examCount.get(i), leftEdge+3+i, examCount.get(i+1)); 

     } 



    } 

} 

を拡張私にそれらを投げてください何もはっきりしていない、あなたは非常に多くのみんなありがとう。

答えて

0

ようこそスタックオーバーフロー。ここにはいくつかのルールがあります - 私は長い間ここにいて、心から愛しています:) - しかし私はSSCEと呼ばれるものを覚えています。シンプルで自己完結型の例で、誰もがたくさんの答えを得ることができます。

public void actionPerformed(ActionEvent arg0) { 
    setVisible(false); 
    invalidate(); 
    DrawCurrent drawplace=new DrawCurrent(); 
    add(drawplace, BorderLayout.CENTER); 
} 

、ここで奇妙なことを実行します。

1)実際の問題は、右のアクションリスナーに新しいパネルを作成することです。

1)setVisible(false)はスクリーンから何かを隠すでしょう - 私が推測するパネルではなく、おそらく外側のパネルです。

2)新しいDrawCurrentインスタンスを作成し、レイアウトに追加します。代わりに、他のパネルを隠してこのパネルを表示させます。

右のロジックは次のとおりです。ちょうどチャートの表示プロパティを変更し、

DrawCurrent current; 
DrawHistorical historical; 

public ExamPerf() extends JPanel { 
    current=new DrawCurrent(); 
    historical=new Historical(); 
    add(current); // TODO you may need further layout settings here 
    add(historical); // TODO you may need further layout settings here 
    current.setVisible(true); 
    historical.setVisible(false); 
} 

とボタンのリスナーで:そのレイアウトに追加を追加し、ExamPerfクラスで一度に両方のDrawCurrentとDrawHistoricalインスタンスを作成しますパネル:

public void actionPerformed(ActionEvent arg0) { 
    current.setVisible(false); 
    history.setVisible(true); 
} 

(および他のパネルを表示する場合はtrueとfalseになり、他のボタン、についても同様)。


また、代わりに独自の回避策を実装するので、箱から出して、これを解決するために設計されているCardLayoutを使用することを検討してください。

https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

関連する問題