2011-09-29 87 views
4

我正在編寫擴展JComboBox的自定義組件。我的問題是,如果我添加或刪除項目,PopupMenu不會實現其大小。所以有列表中有2個項目,但是如果在4個之前我在PopupMenu中有2個「空」項目。JComboBox的設置大小PopupMenu

我發現的唯一的解決方法是做(在JIntelligentComboBox.java線213)


this.setPopupVisible(false);
this.setPopupVisible(true);

但結果將是一個閃爍的PopupMenu :-(

我能做到什麼呢刷新/重繪的彈出菜單無閃爍

爲了測試:the component和一點點test programm
要生成我的問題,你可以例如:

  • 型的 「e」
  • 按 「返回」
  • 型 「M」

在此先感謝

編輯: 我的目標是,就像一個組合框例如Firefox或Chrome中的地址欄,我想顯示包含輸入字符的PopupMenu的所有項目。

cboxtester.java:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 

import javax.swing.DefaultComboBoxModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 


public class cboxtester extends JFrame { 

    private DefaultComboBoxModel dcm = new DefaultComboBoxModel(new Object[][] {new Object[] {"Mittagessen", "", 0}, 
                       new Object[] {"Essen", "", 0}, 
                       new Object[] {"Frühstück", "", 0}, 
                       new Object[] {"Abendessen", "", 0}}); 

    private JIntelligentComboBox icb = new JIntelligentComboBox(dcm); 

    private cboxtester(){ 
     this.add(icb, BorderLayout.CENTER); 

     this.add(new JButton("bla"), BorderLayout.EAST); 

     this.pack(); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     cboxtester cbt = new cboxtester(); 
    } 

} 

JIntelligentComboBox.java:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.ArrayList; 
import java.util.Vector; 

import javax.swing.ComboBoxEditor; 
import javax.swing.ComboBoxModel; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultRowSorter; 
import javax.swing.JComboBox; 
import javax.swing.JList; 
import javax.swing.JTextField; 
import javax.swing.ListCellRenderer; 
import javax.swing.MutableComboBoxModel; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 
import javax.swing.plaf.basic.BasicComboBoxEditor; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 
import javax.swing.plaf.metal.MetalComboBoxEditor; 


public class JIntelligentComboBox extends JComboBox { 

    private ArrayList<Object> itemBackup = new ArrayList<Object>(); 

    /** Initisiert die JIntelligentComboBox */ 
    private void init(){ 

     class searchComboBoxEditor extends BasicComboBoxEditor { 
      public searchComboBoxEditor(){ 
       super(); 
      } 

      @Override 
      public void setItem(Object anObject){ 
       if (anObject == null) { 
        super.setItem(anObject); 
       } else { 
        Object[] o = (Object[]) anObject; 
        super.setItem(o[0]); 
       } 
      } 

      @Override 
      public Object getItem(){ 
       return new Object[]{super.getItem(), super.getItem(), 0}; 
      } 
     } 

     this.setEditor(new searchComboBoxEditor()); 

     this.setEditable(true); 

     class searchRenderer extends BasicComboBoxRenderer { 

      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){ 
       if (index == 0) { 
        setText(""); 
        this.setPreferredSize(new Dimension(1, 1)); 
        return this; 
       } 

       this.setPreferredSize(new Dimension(160, 17)); 

       if (index == list.getModel().getSize() - 1) { 
        this.setBorder(new EmptyBorder(0, 3, 1, 3)); 
       } else { 
        this.setBorder(new EmptyBorder(0, 3, 0, 3)); 
       } 

       Object[] v = (Object[]) value; 
       //System.out.println(v[0]); 
       this.setFont(new Font("Arial", Font.PLAIN, 12)); 
       this.setBackground(Color.white); 

       String s = (String) v[0]; 
       String lowerS = s.toLowerCase(); 
       String sf = (String) v[1]; 
       String lowerSf = sf.toLowerCase(); 
       ArrayList<String> notMatching = new ArrayList<String>(); 

       if (!sf.equals("")){ 
        int fs = -1; 
        int lastFs = 0; 
        while ((fs = lowerS.indexOf((String) lowerSf, (lastFs == 0) ? -1 : lastFs)) > -1) { 
         notMatching.add(s.substring(lastFs, fs)); 
         lastFs = fs + sf.length(); 
         //System.out.println(fs+sf.length()); 
        } 
        notMatching.add(s.substring(lastFs)); 
        //System.out.println(notMatching); 
       } 

       String html = ""; 

       if (notMatching.size() > 1) { 
        html = notMatching.get(0); 
        int start = html.length(); 
        int sfl = sf.length(); 
        for (int i = 1; i < notMatching.size(); i++) { 
         String t = notMatching.get(i); 
         html += "<b style=\"color: black;\">" + s.substring(start, start + sfl) + "</b>" + t; 
         start += sfl + t.length(); 
        } 
       } 

       System.out.println(index + html); 

       this.setText("<html><head></head><body style=\"color: gray;\">" + html + "</body></head>"); 
       return this; 
      } 

     } 

     this.setRenderer(new searchRenderer()); 

     // leeres Element oben einfügen 
     int size = this.getModel().getSize(); 
     Object[] tmp = new Object[this.getModel().getSize()]; 

     for (int i = 0; i < size; i++) { 
      tmp[i] = this.getModel().getElementAt(i); 
      itemBackup.add(tmp[i]); 
     } 

     this.removeAllItems(); 

     this.getModel().addElement(new Object[]{"", "", 0}); 
     for (int i = 0; i < tmp.length; i++) { 
      this.getModel().addElement(tmp[i]); 
     } 

     // keylistener hinzufügen 
     this.getEditor().getEditorComponent().addKeyListener(new KeyListener() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       // TODO Auto-generated method stub 
       searchAndListEntries(((JTextField)JIntelligentComboBox.this.getEditor().getEditorComponent()).getText()); 
       //System.out.println(((JTextField)JIntelligentComboBox.this.getEditor().getEditorComponent()).getText()); 
      } 

      @Override 
      public void keyTyped(KeyEvent e) { 
       // TODO Auto-generated method stub 
      } 
     }); 
    } 

    public JIntelligentComboBox(){ 
     super(); 
    } 

    public JIntelligentComboBox(MutableComboBoxModel aModel){ 
     super(aModel); 
     init(); 
    } 

    public JIntelligentComboBox(Object[] items){ 
     super(items); 
     init(); 
    } 

    public JIntelligentComboBox(Vector<?> items){ 
     super(items); 
     init(); 
    } 

    @Override 
    public MutableComboBoxModel getModel(){ 
     return (MutableComboBoxModel) super.getModel(); 
    } 

    private void searchAndListEntries(Object searchFor){   
     ArrayList<Object> found = new ArrayList<Object>(); 

     //System.out.println("sf: "+searchFor); 

     for (int i = 0; i < this.itemBackup.size(); i++) { 
      Object tmp = this.itemBackup.get(i); 
      if (tmp == null || searchFor == null) continue; 

      Object[] o = (Object[]) tmp; 
      String s = (String) o[0]; 
      if (s.matches("(?i).*" + searchFor + ".*")){ 
       found.add(new Object[]{((Object[])tmp)[0], searchFor, ((Object[])tmp)[2]}); 
      } 
     } 

     this.removeAllItems();   

     this.getModel().addElement(new Object[] {searchFor, searchFor, 0}); 

     for (int i = 0; i < found.size(); i++) { 
      this.getModel().addElement(found.get(i)); 
     } 

     this.setPopupVisible(true);  
    } 



} 
+0

在論壇中發佈您的[SSCCE](http://sscce.org)代碼,而不是使用到其他網站的鏈接。 – camickr

+0

請學習java命名約定並堅持使用 – kleopatra

回答

5

下面的解決方案的基礎是每次調用searchAndListRoutine時間來調整彈出。你需要考慮到,在彈出可以顯示在自己的窗口時,也可以在父框架的分層窗格顯示父框架的邊界之外的彈出式窗口,賬號:

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import java.util.Vector; 

import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.event.*; 
import javax.swing.plaf.basic.*; 
import javax.swing.plaf.metal.*; 
import javax.swing.plaf.basic.*; 


public class JIntelligentComboBox extends JComboBox { 

    private ArrayList<Object> itemBackup = new ArrayList<Object>(); 

    /** Initisiert die JIntelligentComboBox */ 
    private void init(){ 

     class searchComboBoxEditor extends BasicComboBoxEditor { 
      public searchComboBoxEditor(){ 
       super(); 
      } 

      @Override 
      public void setItem(Object anObject){ 
       if (anObject == null) { 
        super.setItem(anObject); 
       } else { 
        Object[] o = (Object[]) anObject; 
        super.setItem(o[0]); 
       } 
      } 

      @Override 
      public Object getItem(){ 
       return new Object[]{super.getItem(), super.getItem(), 0}; 
      } 
     } 

     this.setEditor(new searchComboBoxEditor()); 

     this.setEditable(true); 

     class searchRenderer extends BasicComboBoxRenderer { 

      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){ 
       if (index == 0) { 
        setText(""); 
        this.setPreferredSize(new Dimension(1, 1)); 
        return this; 
       } 

       this.setPreferredSize(new Dimension(160, 17)); 

       if (index == list.getModel().getSize() - 1) { 
        this.setBorder(new EmptyBorder(0, 3, 1, 3)); 
       } else { 
        this.setBorder(new EmptyBorder(0, 3, 0, 3)); 
       } 

       Object[] v = (Object[]) value; 
       //System.out.println(v[0]); 
       this.setFont(new Font("Arial", Font.PLAIN, 12)); 
       this.setBackground(Color.white); 

       String s = (String) v[0]; 
       String lowerS = s.toLowerCase(); 
       String sf = (String) v[1]; 
       String lowerSf = sf.toLowerCase(); 
       ArrayList<String> notMatching = new ArrayList<String>(); 

       if (!sf.equals("")){ 
        int fs = -1; 
        int lastFs = 0; 
        while ((fs = lowerS.indexOf((String) lowerSf, (lastFs == 0) ? -1 : lastFs)) > -1) { 
         notMatching.add(s.substring(lastFs, fs)); 
         lastFs = fs + sf.length(); 
         //System.out.println(fs+sf.length()); 
        } 
        notMatching.add(s.substring(lastFs)); 
        //System.out.println(notMatching); 
       } 

       String html = ""; 

       if (notMatching.size() > 1) { 
        html = notMatching.get(0); 
        int start = html.length(); 
        int sfl = sf.length(); 
        for (int i = 1; i < notMatching.size(); i++) { 
         String t = notMatching.get(i); 
         html += "<b style=\"color: black;\">" + s.substring(start, start + sfl) + "</b>" + t; 
         start += sfl + t.length(); 
        } 
       } 

       this.setText("<html><head></head><body style=\"color: gray;\">" + html + "</body></head>"); 
       return this; 
      } 

     } 

     this.setRenderer(new searchRenderer()); 

     // 
     int size = this.getModel().getSize(); 
     Object[] tmp = new Object[this.getModel().getSize()]; 

     for (int i = 0; i < size; i++) { 
      tmp[i] = this.getModel().getElementAt(i); 
      itemBackup.add(tmp[i]); 
     } 

     this.removeAllItems(); 

     this.getModel().addElement(new Object[]{"", "", 0}); 
     for (int i = 0; i < tmp.length; i++) { 
      this.getModel().addElement(tmp[i]); 
     } 

     // 
     this.getEditor().getEditorComponent().addKeyListener(new KeyListener() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       // TODO Auto-generated method stub 
       searchAndListEntries(((JTextField)JIntelligentComboBox.this.getEditor().getEditorComponent()).getText()); 
       //System.out.println(((JTextField)JIntelligentComboBox.this.getEditor().getEditorComponent()).getText()); 
      } 

      @Override 
      public void keyTyped(KeyEvent e) { 
       // TODO Auto-generated method stub 
      } 
     }); 
    } 

    public JIntelligentComboBox(){ 
     super(); 
    } 

    public JIntelligentComboBox(MutableComboBoxModel aModel){ 
     super(aModel); 
     init(); 
    } 

    public JIntelligentComboBox(Object[] items){ 
     super(items); 
     init(); 
    } 

    public JIntelligentComboBox(Vector<?> items){ 
     super(items); 
     init(); 
    } 

    @Override 
    public MutableComboBoxModel getModel(){ 
     return (MutableComboBoxModel) super.getModel(); 
    } 

    private void searchAndListEntries(Object searchFor){ 
     ArrayList<Object> found = new ArrayList<Object>(); 

     //System.out.println("sf: "+searchFor); 

     for (int i = 0; i < this.itemBackup.size(); i++) { 
      Object tmp = this.itemBackup.get(i); 
      if (tmp == null || searchFor == null) continue; 

      Object[] o = (Object[]) tmp; 
      String s = (String) o[0]; 
      if (s.matches("(?i).*" + searchFor + ".*")){ 
       found.add(new Object[]{((Object[])tmp)[0], searchFor, ((Object[])tmp)[2]}); 
      } 
     } 

     this.removeAllItems(); 

     this.getModel().addElement(new Object[] {searchFor, searchFor, 0}); 

     for (int i = 0; i < found.size(); i++) { 
      this.getModel().addElement(found.get(i)); 
     } 

     //this.setPopupVisible(true); 
     int size = this.getModel().getSize() - 1; 

     System.out.println("Elements: " + size); 

     if (size == 0) 
     { 
      this.setPopupVisible(false); 
      return; 
     } 

     this.setPopupVisible(true); 

     BasicComboPopup popup = 
      (BasicComboPopup)this.getAccessibleContext().getAccessibleChild(0); 
     Window popupWindow = SwingUtilities.windowForComponent(popup); 
     Window comboWindow = SwingUtilities.windowForComponent(this); 

     if (comboWindow.equals(popupWindow)) 
     { 
      Component c = popup.getParent(); 
      Dimension d = c.getPreferredSize(); 
      c.setSize(d); 
     } 
     else 
     { 
      popupWindow.pack(); 
     } 
    } 
} 

的一個問題是,當組合框字段爲空時,模型包含4個條目。我想這是你的匹配邏輯的問題。

+0

+1我在'com.apple.laf.AquaLookAndFeel'看到類似的結果。 – trashgod

+0

請學習java命名約定並堅持下去(無法抗拒:-) – kleopatra

+0

就是這樣!非常感謝你:-)我的計劃也是訪問PopupMenu,但我不知道該怎麼辦 @kleopatra你有一個命名約定的鏈接嗎?我通常使用C++或delphi/pascal進行編程,而且我相對比較新,可能會導致一些問題;-) – guitar1

3

沒有測試你的代碼,

的渲染here的內容和自動完成的JComboBox here

+0

好吧,我檢查了他們兩個,但他們並沒有幫助「渲染器」可能是一個即將出現的問題,如果我測試我的盒子有更多的條目;-)另一個不永久使用PopupMenu ...我試試在firefox或chrome中使用adressbar的組合框(沒有web搜索選項;-)) – guitar1

+0

+1這是另一個'JComboBox' [變種](http://tech.chitgoks.com/2009/11/06/自動填充-的JComboBox /)。 – trashgod

+0

變化是非常好的,但不是真的我需要什麼,因爲這個版本似乎不支持可編輯的組合框,以及這是一種避免我的問題與彈出式刷新,但不是我想要的方式。此外,如果您輸入「球」,則不支持列出「足球」。但無論如何感謝......我現在要去睡覺,請不要期望在我們的下一個我們的答案;-) – guitar1

7

請諮詢我已經修改了下面的sscce,我注意到幾件事情:

  1. 您觀察到的異常不是應用程序當使用apple.laf.AquaComboBoxUI時沒有。特別是,輸入和刪除文本會按預期增長並縮小列表。您可以在您的平臺上嘗試修改後的代碼。

  2. 爲了方便起見,我從KeyListener切換到KeyAdapter,但這不是一個解決方案。您應該使用DocumentListener。正如你現在所做的那樣,它在使用時不能發生變異,所以我沒有進一步追求這一點。

  3. 始終在event dispatch thread上構建GUI。

  4. 硬編碼的維度和新穎的字體很少看起來很正常的其他外觀&覺得實現。我簡單地刪除了你的顯示外觀。

  5. 構造函數在構造父類之後修改模型,所以結果取決於實例的順序。一個單獨的模型可能更容易管理。

更新:添加驗證@ camickr的代碼solution

Combo image

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Window; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JTextField; 
import javax.swing.MutableComboBoxModel; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicComboBoxEditor; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 
import javax.swing.plaf.basic.BasicComboPopup; 

public class CBoxTest extends JFrame { 

    private CBoxTest() { 
     DefaultComboBoxModel dcm = new DefaultComboBoxModel(); 
     StringBuilder s = new StringBuilder(); 
     for (char i = 'a'; i < 'm'; i++) { 
      s.append(i); 
      dcm.addElement(new Object[]{s.toString(), "", 0}); 
     } 
     JIntelligentComboBox icb = new JIntelligentComboBox(dcm); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.add(icb, BorderLayout.CENTER); 
     this.add(new JButton("Button"), BorderLayout.EAST); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CBoxTest cbt = new CBoxTest(); 
      } 
     }); 
    } 

    class JIntelligentComboBox extends JComboBox { 

     private List<Object> itemBackup = new ArrayList<Object>(); 

     public JIntelligentComboBox(MutableComboBoxModel aModel) { 
      super(aModel); 
      init(); 
     } 

     private void init() { 
      this.setRenderer(new searchRenderer()); 
      this.setEditor(new searchComboBoxEditor()); 
      this.setEditable(true); 
      int size = this.getModel().getSize(); 
      Object[] tmp = new Object[this.getModel().getSize()]; 
      for (int i = 0; i < size; i++) { 
       tmp[i] = this.getModel().getElementAt(i); 
       itemBackup.add(tmp[i]); 
      } 
      this.removeAllItems(); 
      this.getModel().addElement(new Object[]{"", "", 0}); 
      for (int i = 0; i < tmp.length; i++) { 
       this.getModel().addElement(tmp[i]); 
      } 
      final JTextField jtf = (JTextField) this.getEditor().getEditorComponent(); 
      jtf.addKeyListener(new KeyAdapter() { 

       @Override 
       public void keyReleased(KeyEvent e) { 
        searchAndListEntries(jtf.getText()); 
       } 
      }); 
     } 

     @Override 
     public MutableComboBoxModel getModel() { 
      return (MutableComboBoxModel) super.getModel(); 
     } 

     private void searchAndListEntries(Object searchFor) { 
      List<Object> found = new ArrayList<Object>(); 
      for (int i = 0; i < this.itemBackup.size(); i++) { 
       Object tmp = this.itemBackup.get(i); 
       if (tmp == null || searchFor == null) { 
        continue; 
       } 
       Object[] o = (Object[]) tmp; 
       String s = (String) o[0]; 
       if (s.matches("(?i).*" + searchFor + ".*")) { 
        found.add(new Object[]{ 
          ((Object[]) tmp)[0], searchFor, ((Object[]) tmp)[2] 
         }); 
       } 
      } 
      this.removeAllItems(); 
      this.getModel().addElement(new Object[]{searchFor, searchFor, 0}); 
      for (int i = 0; i < found.size(); i++) { 
       this.getModel().addElement(found.get(i)); 
      } 
      this.setPopupVisible(true); 
      // https://stackoverflow.com/questions/7605995 
      BasicComboPopup popup = 
       (BasicComboPopup) this.getAccessibleContext().getAccessibleChild(0); 
      Window popupWindow = SwingUtilities.windowForComponent(popup); 
      Window comboWindow = SwingUtilities.windowForComponent(this); 

      if (comboWindow.equals(popupWindow)) { 
       Component c = popup.getParent(); 
       Dimension d = c.getPreferredSize(); 
       c.setSize(d); 
      } else { 
       popupWindow.pack(); 
      } 
     } 

     class searchRenderer extends BasicComboBoxRenderer { 

      @Override 
      public Component getListCellRendererComponent(JList list, 
       Object value, int index, boolean isSelected, boolean cellHasFocus) { 
       if (index == 0) { 
        setText(""); 
        return this; 
       } 
       Object[] v = (Object[]) value; 
       String s = (String) v[0]; 
       String lowerS = s.toLowerCase(); 
       String sf = (String) v[1]; 
       String lowerSf = sf.toLowerCase(); 
       List<String> notMatching = new ArrayList<String>(); 

       if (!sf.equals("")) { 
        int fs = -1; 
        int lastFs = 0; 
        while ((fs = lowerS.indexOf(lowerSf, (lastFs == 0) ? -1 : lastFs)) > -1) { 
         notMatching.add(s.substring(lastFs, fs)); 
         lastFs = fs + sf.length(); 
        } 
        notMatching.add(s.substring(lastFs)); 
       } 
       String html = ""; 
       if (notMatching.size() > 1) { 
        html = notMatching.get(0); 
        int start = html.length(); 
        int sfl = sf.length(); 
        for (int i = 1; i < notMatching.size(); i++) { 
         String t = notMatching.get(i); 
         html += "<b style=\"color: black;\">" 
          + s.substring(start, start + sfl) + "</b>" + t; 
         start += sfl + t.length(); 
        } 
       } 
       this.setText("<html><head></head><body style=\"color: gray;\">" 
        + html + "</body></head>"); 
       return this; 
      } 
     } 

     class searchComboBoxEditor extends BasicComboBoxEditor { 

      public searchComboBoxEditor() { 
       super(); 
      } 

      @Override 
      public void setItem(Object anObject) { 
       if (anObject == null) { 
        super.setItem(anObject); 
       } else { 
        Object[] o = (Object[]) anObject; 
        super.setItem(o[0]); 
       } 
      } 

      @Override 
      public Object getItem() { 
       return new Object[]{super.getItem(), super.getItem(), 0}; 
      } 
     } 
    } 
} 
1

使用ComboboxModel中的Vector數組面向相同的問題,它擴展AbstractListModel & 實現MutableComboBoxModel。解決使用setMaximumRowCount:

  1. 疊代數據庫中的值,並將其保存到 公共ArrayList的listInCombobox =新的ArrayList();

  2. myComboBox.setMaximumRowCount(listInCombobox.size());

  3. 在myComboBox MouseListener(mousePressed)中執行上述操作。