2012-02-16 11 views
0

私はこのテーマに関する多くのスレッドと質問を読んだが、問題の実行可能な解決策には達していないようだ。以下は、コンポーネントの追加と削除に使用されるメソッドのコードです。JPanelを動的に削除

public void addAuxPanel (String pType, int pStart, int pEnd) { 

    int id = mPanels.size(); 
    int xPos = PANEL_START_X; 
    int yPos = PANEL_START_Y + (PANEL_HEIGHT * id) + 15; 

    if (id == 0) { 
     xPos = PANEL_START_X; 
    } 

    String type = pType; 
    int start = pStart; 
    int end = pEnd; 

    AuxPanel p = new AuxPanel(type, start, end, id, this); 
    mPanels.add(p); 

    p.setBounds(xPos, yPos, 300, 25); 

    getRootPane().add(p); 
    getRootPane().repaint(); 
    getRootPane().revalidate(); 
} 

public void removeAuxPanel (AuxPanel pPanel) { 

      getRootPane().remove(pPanel); 
      getRootPane().revalidate(); 
      getRootPane().repaint(); 

} 
+0

よりよいヘルプについてすぐに、[SSCCE](http://sscce.org/)を投稿してください。 * "私がそれらを必要とするパネル上の要素を得るためのレイアウトはありません" *おそらく問題の核心です。レイアウトが消えたら、あらゆる種類の驚きを期待してください。コンポーネントに詰め物や枠線を含むレイアウトを使用すると、画面とPLAF、*、*の両方にぴったりなレイアウトを実現できます。 –

答えて

1

panel.setVisible (false)を呼び出すのはどうですか?

+0

パネルは、表示または非表示に設定するのではなく、実行時に追加および削除する必要があります。ユーザーが画像をクリックすると、それが保存されているJPanelから削除されます。 – Prmths

+0

これは最も効率的な方法であるはずです+1 – mKorbel

+0

@strangeInAStrangerLandアイコンをJLabelにアイコンとして配置すると、チュートリアルhttp://docs.oracle.com/javase/tutorial/uiswing/components/icon.htmlおよびhttp://docs.oracle.com/javase/tutorial/uiswing/components/label.html – mKorbel

2

あなたは単にあなたの通常の再検証を()やるよりframeObject.remove(yourPanel);

を行うと、再描画することができます()。

ここにあなたの助けのための小さなコード:

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

public class TwoPanels extends JFrame { 

    public TwoPanels() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     final JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.RED); 
     final JPanel panel2 = new JPanel(); 
     panel2.setBackground(Color.BLUE); 

     JButton button = new JButton("ADD AND REMOVE PANEL"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (panel1.isShowing()) { 
        remove(panel1); 
        add(panel2, BorderLayout.CENTER); 
        revalidate(); 
        repaint(); 
       } else if (panel2.isShowing()) { 
        remove(panel2); 
        add(panel1, BorderLayout.CENTER); 
        revalidate(); 
        repaint(); 
       } 
      } 
     }); 

     add(panel1, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 

     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TwoPanels(); 
      } 
     }); 
    } 
} 

あなたはJPanelのからコンポーネントを削除したい場合は、(このコードの削除を参照)がまだこれのために動作します:

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

public class TwoPanels extends JFrame { 

    public TwoPanels() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     final JPanel panel1 = new JPanel(); 
     final JLabel label = new JLabel("I am a JLabel"); 
     panel1.setBackground(Color.WHITE); 
     panel1.add(label); 

     JButton button = new JButton("ADD AND REMOVE PANEL"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (label.isShowing()) { 
        panel1.remove(label); 
        panel1.revalidate(); 
        panel1.repaint(); 
       } else { 
        panel1.add(label); 
        panel1.revalidate(); 
        panel1.repaint(); 
       } 
      } 
     }); 

     add(panel1, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 

     pack(); 
      setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TwoPanels(); 
      } 
     }); 
    } 
} 
+0

お返事ありがとうございます。 remove()だけを呼び出すと、オブジェクトはJPanelから削除されません。私が理解するように、revalidate()はコンテナを再描画するために使用されます。私はまた、コンテナはサブクラス化されたJPanelであり、レイアウトを持たないWindowBuilderを使用しているので、私がそれらを必要とするパネル上の要素を取得するので、レイアウトが割り当てられていないことを言及する必要があります。私はこれが悩まされていることを知っていますが、率直に言ってクラスがぎこちなくなければ、私はそれらを使っても大丈夫です。 – Prmths

+0

@strangeInAStrangerLand:JPanel上のJPanelや何かを削除したいですか? –

+0

私は、JPanelのサブクラスである別のオブジェクトから削除したいJPanelのサブクラスであるオブジェクトを持っています。コンテナは、子クラスを追加および削除します。私は各子クラスにリスナーを持っています。リスナーはクリックされたかどうかを確認し、そうであればコンテナのremoveメソッドを呼び出します。 – Prmths

関連する問題