2017-09-21 89 views
1

我想將當前的JScrollpane更改爲新的JScrollpane。我想在按下我的按鈕並調用方法actionPerformed之後更改它。 我現在遇到的問題是,它只在應用程序的開始處繪製Jscroll,當我想要更改它時,它才能工作(當應用程序正在運行時)。將當前的JScrollPane替換爲JPanel中的另一個JScrollPane

我所做的是: 在應用程序的開始,我製作了一個新的JscrollPane,這個是空的。如果按下按鈕:顯示另一個帶有內容的JscrollPane。

if(btnPressed == true){ 

//set current empty jscroll pane to a filled one. 
jscrollpane = View.createScrollPlane(); 


//View.createScrollPlane = This method fills the JscrollPane with text. 
} 
else { //show a empty one 
jscrollpane = new JscrollPane(); 

} 

我曾嘗試: - 刪除 - 添加 - 重新驗證 - 重繪

而且也: JscrollPane.setViewPortView(JScrollPane的);

我看過CardLayout,但我寧願不要,它dosent允許我,因爲只有空容器可以更改爲CardLayout。目前它在GridBagLayout上。

在此先感謝

重新編輯:創建UI的方法dosent改變當前空Jscrollpanel到新的一個。它只初始化一次(在開始時),但劑量更新Jscroll面板。 (當我試圖把它放在假)它的工作,布爾確實更改爲true,但劑量更新jscroll面板。

package readDataPluginPackage; 

import com.change_vision.jude.api.inf.AstahAPI; 
import com.change_vision.jude.api.inf.project.ProjectAccessor; 
import javafx.embed.swing.JFXPanel; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.beans.PropertyChangeListener; 

public class Application { 
    JPanel mainJPanel; 
    private JPanel leftJPanel; 
    private JPanel rightJPanel; 
    private JButton btnSynchronise; 
    private JButton btnPreview; 
    private JScrollPane JScrollPaneReport; 
    public JScrollPane JScrollPanePreview; 
    private boolean btnPreviewClicked = false; 

    public Application() { 
     $$$setupUI$$$(); 

     btnPreview.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       btnPreviewClicked = true; 



       JOptionPane.showMessageDialog(null, "Showing..." + btnPreviewClicked); 


       // ShowXMLFileView showXMLFileView = new ShowXMLFileView(); 
       //  JScrollPanePreview = showXMLFileView.createLabelPane(); 

       // if (btnPreview.isEnabled()) { 
       // ShowXMLFileView showXMLFileView = new ShowXMLFileView(); 
       // JScrollPanePreview = showXMLFileView.createLabelPane(); 
       JOptionPane.showMessageDialog(null, "XML File Preview has been updated."); 


       createUIComponents(); 
       // JScrollPanePreview.revalidate(); 
       // JScrollPanePreview.repaint(); 
       JOptionPane.showMessageDialog(null, "Components are created again."); 

      } 


      // } 


     }); 
     btnSynchronise.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(null, "Synchronising..."); 
      } 
     }); 


    } 


    public static void main(String[] args) { 
     try { 

      //Save Astah Project as XML File 
      ProjectAccessor prjAccessor = AstahAPI.getAstahAPI().getProjectAccessor(); 
      prjAccessor.open("C:\\Users\\delina\\generated\\test.asta"); 
      prjAccessor.exportXMI("C:\\Users\\delina\\generatedXMI\\temp.xml"); 
      prjAccessor.close(); 

      //Show the most recent version of the xml file of the Astah Project 
      ReadXMLFile rd = new ReadXMLFile(); 
      rd.showXMLFileLines(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


     JFrame frame = new JFrame("Application"); 
     frame.setContentPane(new Application().mainJPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void createUIComponents() { 
     if (btnPreviewClicked == true) { 


     // ShowXMLFileView showXMLFileView = new ShowXMLFileView(); 
      // JScrollPanePreview = showXMLFileView.createLabelPane(); 
       // JScrollPanePreview.setViewportView(JScrollPanePreview); 







      leftJPanel.remove(JScrollPanePreview); 

      ShowXMLFileView showXMLFileView = new ShowXMLFileView(); 
      JScrollPane JScrollPanePreview = showXMLFileView.createLabelPane(); 


      leftJPanel.add(JScrollPanePreview); 
     JScrollPanePreview.revalidate(); 
     JScrollPanePreview.repaint(); 







     JOptionPane.showMessageDialog(null, "JScrollPanel changed"); 
    } else { 
      JScrollPanePreview = new JScrollPane(); 
    } 


    } 


    /** 
    * Method generated by IntelliJ IDEA GUI Designer 
    * >>> IMPORTANT!! <<< 
    * DO NOT edit this method OR call it in your code! 
    * 
    * @noinspection ALL 
    */ 
    private void $$$setupUI$$$() { 
     createUIComponents(); 
     mainJPanel = new JPanel(); 
     mainJPanel.setLayout(new GridBagLayout()); 
     leftJPanel = new JPanel(); 
     leftJPanel.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc; 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     mainJPanel.add(leftJPanel, gbc); 
     btnSynchronise = new JButton(); 
     btnSynchronise.setText("Synchronise"); 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 2; 
     gbc.weightx = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     leftJPanel.add(btnSynchronise, gbc); 
     btnPreview = new JButton(); 
     btnPreview.setText("Preview"); 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.weightx = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     leftJPanel.add(btnPreview, gbc); 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     leftJPanel.add(JScrollPanePreview, gbc); 
     JScrollPanePreview.setBorder(BorderFactory.createTitledBorder("XML File Preview")); 
     rightJPanel = new JPanel(); 
     rightJPanel.setLayout(new GridBagLayout()); 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     mainJPanel.add(rightJPanel, gbc); 
     JScrollPaneReport = new JScrollPane(); 
     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     rightJPanel.add(JScrollPaneReport, gbc); 
     JScrollPaneReport.setBorder(BorderFactory.createTitledBorder("Synchronise report")); 
    } 

    /** 
    * @noinspection ALL 
    */ 
    public JComponent $$$getRootComponent$$$() { 
     return mainJPanel; 
    } 
} 


    package readDataPluginPackage; 

import com.change_vision.jude.api.inf.project.ProjectAccessor; 
import com.change_vision.jude.api.inf.project.ProjectAccessorFactory; 
import com.change_vision.jude.api.inf.project.ProjectEvent; 
import com.change_vision.jude.api.inf.project.ProjectEventListener; 
import com.change_vision.jude.api.inf.ui.IPluginExtraTabView; 
import com.change_vision.jude.api.inf.ui.ISelectionListener; 

import javax.swing.*; 
import java.awt.*; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 


public class ShowUserInterface extends JPanel implements IPluginExtraTabView, ProjectEventListener { 

    public ShowUserInterface() { 
     initComponents(); 
    } 

    private void initComponents() { 
     setLayout(new BorderLayout()); 
     add(createLabelPane()); 
     addProjectEventListener(); 
    } 

    private void addProjectEventListener() { 
     try { 
      ProjectAccessor projectAccessor = ProjectAccessorFactory.getProjectAccessor(); 
      projectAccessor.addProjectEventListener(this); 
     } catch (ClassNotFoundException e) { 
      e.getMessage(); 
     } 
    } 

    private Container createLabelPane() { 
     JLabel label = new JLabel("AuguSoft Synchronise"); 
     JScrollPane pane = new JScrollPane(label); 


     Method privateMethod = null; 
     Application app = null; 
     Object o = null; 
     JComponent jComponent = null; 
     try { 
      app = new Application(); 
      privateMethod = Application.class.getDeclaredMethod("$$$setupUI$$$"); 
      privateMethod.setAccessible(true); 
      o = privateMethod.invoke(app); 
      jComponent = app.$$$getRootComponent$$$(); 



     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
     return jComponent; 
    } 





    @Override 
    public void projectChanged(ProjectEvent e) { 
    } 

    @Override 
    public void projectClosed(ProjectEvent e) { 
    } 

    @Override 
    public void projectOpened(ProjectEvent e) { 
    } 

    @Override 
    public void addSelectionListener(ISelectionListener listener) { 
    } 

    @Override 
    public Component getComponent() { 
     return this; 
    } 

    @Override 
    public String getDescription() { 
     return "Show AuguSoft Synchronise here"; 
    } 

    @Override 
    public String getTitle() { 
     return "AuguSoft View"; 
    } 

    public void activated() { 

    } 

    public void deactivated() { 

    } 
} 
+0

有沒有足夠的上下文就能確定它是什麼你做的不對,考慮提供這表明你的問題 – MadProgrammer

+0

@MadProgrammer我添加了一個可運行的例子代碼,你的幫助將非常感謝:) – Hye

回答

1

所以,用做別的什麼,但看你的代碼,我注意到,在您的createUIComponents方法,你的陰影財產JScrollPanePreview ...

public class Application { 

    //...  
    public JScrollPane JScrollPanePreview; 
    //...  
    public Application() {..} 

    private void createUIComponents() { 
     if (btnPreviewClicked == true) { 
      //... 
      leftJPanel.remove(JScrollPanePreview); 

      ShowXMLFileView showXMLFileView = new ShowXMLFileView(); 
      JScrollPane JScrollPanePreview = showXMLFileView.createLabelPane(); 
      //... 
     } else { 
      JScrollPanePreview = new JScrollPane(); 
     } 

    } 

這意味着你下一次來取代JScrollPanePreview,你將不會有正確的參考去除它。

在我看來(我沒有你充分的代碼基礎,或意向),我只需更換JScrollPanePreview視口(除此之外,我不知道你是如何分配ContainerJScrollPane反正: P)

private void createUIComponents() { 
     if (btnPreviewClicked == true) { 
      JScrollPanePreview.setViewportView(showXMLFileView.createLabelPane()); 
     } else { 
      JScrollPanePreview = new JScrollPane(); 
     } 

    } 

只是作爲一個觀察;)

+0

這工作!非常感謝! – Hye