2016-11-04 8 views
0

私は現在swing.boxを持っているJPanelを持っています。それ自体には任意の数のJButtonがあります。(nuke)javax.swing.boxを完全に削除するにはどうすればいいですか?

JButtonの1つに新しいJButtonを作成できるようになりました。 しかし、新しいボタンを作成した後、ボタンを正しい位置(アルファベット順)にリスト内に移動して、うまくいくようにします。しかし、私は最終的にいくつかの標準的なボタンを追加するように最後のボタンではないことを確信しています。

ここで問題は、ボックスを再構築した後で、ボタンを押したボックスを傷つけることができないことです。私も持っている

(もhttps://github.com/Diamundo/PhotoSelectorSys/ButtonPanel.java、具体的にライン42で、関数の開始initButtons()を参照)

(問題は、私はそれらを置く場合に有効になりません推奨サイズにボタンを追加することですストレートパネルで、私はボックスに入れて...ので、あなたは私も非常に歓迎だボックスの代わりにすべてのボタンを削除することができます解決策がある場合ない場合:D)を

package photoselectorsys; 

import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.File; 
import java.util.ArrayList; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class ButtonPanel extends JPanel { 
    private AppFrame listener; 
    private String path; 
    private Box box; 

    public ButtonPanel(int width, int height){ 
     setPreferredSize(new Dimension(width, height)); 
     setVisible(true); 
     box = Box.createVerticalBox(); 
    } 

    public void setPath(String path){ 
     this.path = path; 
     initButtons(); 
//  pushButtons(); 
     this.revalidate(); 
    } 

    /*public void pushButtons() { 
     for(JButton jb : buttons) { //buttons was an ArrayList of button names. Is now the box. 
      this.remove(jb); //remove the button from the panel. 
     } 
     for(JButton jb : buttons) { //buttons should be changed to the box 
      add(jb); 
     } 
    }*/ 

    public void initButtons(){ 
/*  if(box.hasButtons()) { 
      box.nuke(); 
      box = new Box(..); 
     } 
*/ 

     JButton jb; 
     File directory = new File(path); 
     File[] listFiles = directory.listFiles(); 
     ArrayList<String> btns = new ArrayList<>(); 
     for (File file : listFiles) { 
      if (file.isDirectory()) { 
       btns.add(file.getName()); 
      } 
     } 
     btns.add("Add a new Button"); 
     btns.add("Rotate CW"); 
     btns.add("Rotate CCW"); 
     btns.add("Rotate 180*"); 

     System.out.println("buttons " + btns.size()); 
     if(btns.size() > 4) { //if there's at least one folder, size > 4. Else add one big button or ask to create subfolder 
      for(String btn : btns) { 
       jb = new JButton(btn); 
       jb.setFont(new Font("Arial", Font.PLAIN, 20)); 
       jb.setPreferredSize(new Dimension(this.getWidth()-20, 40)); 
       jb.setVisible(true); 

       jb.addMouseListener(new MouseListener() { 
        @Override 
        public void mouseClicked(MouseEvent arg0) { 
          onButtonPress((JButton) arg0.getSource()); 
        } 
        @Override 
        public void mouseEntered(MouseEvent e) { /* unused */ } 
        @Override 
        public void mouseExited(MouseEvent e) { /* unused */ } 
        @Override 
        public void mousePressed(MouseEvent e) { /* unused */ } 
        @Override 
        public void mouseReleased(MouseEvent e) { /* unused */ } 
       });    
       /*box.*/add(jb); 
      } 
     } else { 
      // do add folder magic from the start. 
      jb = new JButton("Add a new Button"); 
      jb.setFont(new Font("Arial", Font.PLAIN, 20)); 
      jb.setPreferredSize(new Dimension(this.getWidth()-20, this.getHeight()-30)); 
      jb.setSize(new Dimension(this.getWidth()-20, this.getHeight())); 
      jb.setVisible(true); 

      jb.addMouseListener(new MouseListener() { 
       @Override 
       public void mouseClicked(MouseEvent arg0) { 
         onButtonPress((JButton) arg0.getSource()); 
       } 
       @Override 
       public void mouseEntered(MouseEvent e) { /* unused */ } 
       @Override 
       public void mouseExited(MouseEvent e) { /* unused */ } 
       @Override 
       public void mousePressed(MouseEvent e) { /* unused */ } 
       @Override 
       public void mouseReleased(MouseEvent e) { /* unused */ } 
      });    
      /*box.*/add(jb); 
     } 
//  add(box); 
    } 

    public void onButtonPress(JButton jb){ 
// not interesting for this question. See github for function. 
    } 

    public void addListener(AppFrame listener) { 
     this.listener = listener; 
    } 
} 
+0

あなたの問題を解決するために、あなたの問題を解決するために[SSCCE](http://sscce.org)を作成してください。 –

+0

子リストの適切な位置にボタンを追加するか(または必要に応じてそのリストをクリアして再構築する)、コンテナコンポーネントを無効にするだけで十分です(さまざまな 'add'と' remove'メソッドを見てください。 'add(Component c、int index)'と 'removeAll()')を呼び出します。そうでない場合、イベントディスパッチスレッドなどをブロックするような何かが間違っている可能性があります。 – Thomas

+0

Sergiy、コードを追加しました。トーマス、私は削除を見てみましたが、それを理解していませんでした(私のJavaは少し錆びましたが、コードjavaを実行したときにコンポーネントを追加/削除することはあまり働いていませんでした)。私はそれらを見て、チップのおかげで! – Diamundo

答えて

2

変更するにはボタンをクリックすると、新しいボックスを作成する必要はなく、次の2つのうちのいずれかを実行します。

A)box.add(button, index)
Bを使用して正しい位置にボタンを追加)box.removeAll()を使用して、すべてのボタンを削除し、(再)

を必要に応じてボタンを追加し、私はバリアントAを好む)が、例ところがあるかもしれません箱の内容を最初から再構築するほうが良いかもしれません。

通常、コンポーネントはレイアウトが無効で再計算が必要であることを認識する必要があるため、これだけで十分です。これが起こらない場合、または何らかの理由で親コンテナを再検証する必要がある場合は、該当するコンポーネントのinvalidate()メソッドを呼び出します。

+0

revelidate&repaintまたはJFrame.pack(そのJFramesバインドを変更することができます) – mKorbel

関連する問題