2011-12-30 2 views
1

Сделал поиск, и я действительно не видел согласованного ответа с этой сложной проблемой.Невозможно вызвать JPanel в кнопке JPanel

Здесь я прихожу, ребята. Заранее благодарны за Вашу помощь.

Я пытаюсь вызвать JPanel внутри кнопки JPanel с помощью actionlistener; , пока он работал нормально с первой кнопкой, которую я добавил, она не работает для двух других; разница между jpanels, вызываемыми в первой кнопке, а остальные две - , первая кнопка, вызывающая другой Jpanel из текущего Jpanel; но два других вызывали два частных класса jpanel в текущих Jpanels.

Что я делаю: я пытаюсь отображать две разные диаграммы в пределах одной Jpanel, используя две кнопки, взаимозаменяемые; частные jpanels используются исключительно для рисования диаграмм; Я думал, что мне нужно просто вызвать эти два jpanels на разных кнопках, не создавая абсолютно новый JPanel до , чтобы каждый jpanel рисовал диаграмму, а затем вызывал их, как я вызываю другую jpanel в первой кнопке.

извиниться за мои неудобные формулировки..Есть коды.

общественного класса ExamPerf расширяет JPanel {

конечная JPanel Viewperf = TabbedQuiz.viewPerfPanel;

final ChartsPanel CP = new 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); 

     } 
    }); 

// Это вторая кнопка, я пытаюсь вызвать частный класс 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); 




     } 
    }); 

// это третья кнопка, такая же проблема.

  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); 

    } 

} 

// это второй частный класс, 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. Простой, автономный пример, который гарантирует, что вы получите много ответов от всех.

1) Реальная проблема заключается в том, что вы создаете новые панели прямо в слушателе действий:

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

и делать странные вещи здесь.

1) setVisible (false) скроет что-то с экрана - не панель, которую я предполагаю, но, вероятно, внешняя панель.

2) вы создаете новый экземпляр DrawCurrent и добавляете в макет вместо того, чтобы скрывать другую панель и делать эту панель видимой.

Право логика: создавать как экземпляры DrawCurrent и DrawHistorical сразу в классе ExamPerf, добавить добавить его расположение:

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); 
} 

И в кнопке слушателей, просто изменить видимые свойства диаграммы панели:

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

(и то же самое для другой кнопки, что делает истинным и ложным, чтобы показать другую панель).


В качестве альтернативы, вместо реализации собственного метода обхода, рассмотрите возможность использования CardLayout, который предназначен для решения этих из коробки.

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

Смежные вопросы