2014-02-15 2 views
-1

, когда я пытаюсь запустить этот класс после того, как я искать его (в actionPerformed) он не обновляет JFrame, я попытался целую кучу разных вещей (repaint(), revalidate() и т.д.), но ни один из них работают, если бы вы могли обнаружить проблему, которая могла бы помочь.JFrame не будет обновлять

public class Scroll extends JPanel implements ActionListener { 

    private static final int N = 16; 
    private JTextArea last; 
    private int index; 
    JButton sort, Quit, search; 
    arraySorter array; 
    JFrame f; 
    String[]sValue; 
    double[]dValue; 
    boolean checks; 
    public Scroll(String[]sValues, double[]dValues, boolean check, String compare) { 
     sValue=sValues; 
     dValue=dValues; 
     checks=check; 
     this.setLayout(new GridLayout(0, 1, 3, 3)); 
     System.out.println(compare); 
     if(check){ 
      for (int i = 0; i < sValues.length; i++) { 
        if(sValues[i].contains(""+compare+""))this.add(create(i, sValues[i], 0, true)); 
       } 
     }else{ 
      for (int i = 0; i < dValues.length; i++) { 
       this.add(create(i, null, dValues[i], false)); 
      } 
     } 
    } 
    private JTextArea create(int i, String j, double k, boolean check) { 
     if(check)last = new JTextArea(i+1+". "+j+""); 
     else last = new JTextArea(i+1+". "+k+""); 
     last.setEditable(false); 
     return last; 
    } 

public void display() { 

     f = new JFrame("This is your sorted list!!!!"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(this)); 
     f.invalidate(); 
     f.validate(); 
     f.repaint(); 
     f.setSize(300, 300); 

     JPanel panel=new JPanel(); 
     f.add(panel, BorderLayout.NORTH); 
     Quit=new JButton("Quit");//sets instruction button for frame 
     //adds an actionlistener 
     Quit.addActionListener(this); 
     panel.add(Quit); 


     search=new JButton("search");//sets instruction button for frame 
     //adds an actionlistener 
     search.addActionListener(this); 
     panel.add(search); 
     f.invalidate(); 
     f.validate(); 
     f.repaint(); 
     f.setVisible(true); 
    } 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource()==Quit){ 
      f.dispose(); 
      array=new arraySorter(); 
     } 

     if(e.getSource()==search){ 
      f.dispose(); 
      String compare=JOptionPane.showInputDialog("What do you want to search for?"); 
      f.removeAll(); 
      new Scroll(sValue, dValue, checks, compare); 
      display(); 
     } 
    } 

} 
+0

Попробуйте заменить f.dospose() на f.setVisible (false). – selalerer

+0

Не знаете, что именно вы пытаетесь сделать, но я вижу удаление компонентов и добавление компонентов. Кажется, ваша ситуация лучше подходит для «CardLayout». См. Примеры из [** этого вопроса **] (http://stackoverflow.com/questions/21592492/how-can-i-switch-between-jpanels) и исполняемый пример из [** этого ответа **] (http : //stackoverflow.com/a/21460065/2587435) и [** Как использовать CardLayout **] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) –

+0

it doesn 't обновление средств JFrame означает, что JFrame не отображается или отображается JFrame, но JPanel не отображается? – user12458

ответ

0

Из-за внешнего вида вы закрываете текущий JFrame и создаете абсолютно новый JFrame каждый раз, когда выполняете поиск. Почему бы просто не создать метод обновления, который заполняет все внутри текущего JFrame? Метод, который вы используете, выглядит крайне неэффективным и, скорее всего, является причиной вашей проблемы.

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