2016-09-27 3 views
0

Ich möchte einige meiner JFrame-Komponenten (JPanel, ChartPanel) ändern, nachdem ein Aktionsereignis aufgetreten ist (Schaltfläche geklickt). Unter einem konkreten Beispiel:Frame wird beim Ändern eines Elements falsch aktualisiert

Zunächst beginne ich meinen Rahmen leer (nur mit Menüleiste und ohne weitere Panels). Ich klicke Menü 'Datei> Öffnen', wähle eine Datei und hier ein Diagramm. Danach habe ich die Größe meines Rahmens angepasst. Alles ist perfekt. Aber das nächste ich nochmaliges Klicken Datei wählen neues Diagramm zu bekommen und statt dieser mein Diagramm nicht korrekt aktualisiert: here is an illustration of problem

Und hier ist mein Code:

public MenuBarDataAnalyser() { 

    JMenu menuFile = new JMenu("File"); 

    itmOpen = new JMenuItem("Open..."); 
    itmOpen.addActionListener(this); 

    add(menuFile); 
    menuFile.add(itmOpen); 
} 


@Override 
public void actionPerformed(ActionEvent e) { 
if(source == itmOpen){ 
     final JFileChooser fch = new JFileChooser(); 
     FileFilter filter = new FileNameExtensionFilter("FITS file", "fits"); 
     fch.setFileFilter(filter); 
     int response = fch.showOpenDialog(itmOpen); 
     if (response == JFileChooser.APPROVE_OPTION){ 
      String pathFilename = fch.getSelectedFile().toString(); 
      JFreeChart chart = GUIDataAnalyserFrame.createChart(pathFilename); 
       ChartPanel chartPanel = new ChartPanel(chart, true, true, true, false, true); 
       JButton button = new JButton("Calibrate"); 
       JPanel buttonPanel = new JPanel(); 
       buttonPanel.add(button); 

       chartPanel.revalidate(); 

       GUIDataAnalyserApp.analyserFrame.add(chartPanel, BorderLayout.CENTER); 
       GUIDataAnalyserApp.analyserFrame.add(buttonPanel, BorderLayout.EAST); 
       GUIDataAnalyserApp.analyserFrame.revalidate(); 
       } 
     } 
} 

Warum ist das passiert und was ich brauche, um Veränderung?

Antwort

3

Eine Vermutung, da Sie haben keine gültige minimal code example program, geschrieben, aber Sie sollten die alten Komponenten aus dem Behälter entfernen, dann die neue hinzufügen, dann rufen revalidate()DANN Anruf repaint() - ein wichtiger Schritt, die Sie scheinen vermisst werden. Das Repaint sollte helfen, alte "schmutzige" Pixel zu entfernen.

Oder Sie könnten die viel einfachere Route gehen und einfach ein CardLayout verwenden, um Ihnen zu helfen, Ansichten auszutauschen.

+0

Vielen Dank! Es klappt. Ich habe meine Elemente aus dem Frame entfernt (wenn sie vorhanden sind), dann Revalidate und Repaint für jedes Element genannt. –

+0

@AndreiSh: Nein, nicht für jedes Element. Rufen Sie es auf dem Container auf, hier 'GUIDataAnalyserApp.analyserFrame', nachdem Sie alles entfernt und hinzugefügt haben. –

+1

Ähnliche Alternativen werden vorgeschlagen [hier] (http://stackoverflow.com/a/39120572/230513). – trashgod

Verwandte Themen