java - 如何完全删除(核武器)javax.swing.box?

标签 java swing jbutton box

我有一个 JPanel,其中当前有一个 swing.box,它本身包含任意数量的 JButton。

现在,其中一个 JButton 能够创建一个新的 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;
    }
}

最佳答案

要更改框中的按钮,您不必创建新框,而是执行以下两件事之一:

a) 使用 box.add( button, index ) 在正确位置添加按钮
b) 使用 box.removeAll() 删除所有按钮,并根据需要(重新)添加按钮

我更喜欢变体 a),但在某些情况下,从头开始重建盒子内容可能是更好的方法。

通常,仅此一项就足够了,因为组件应该意识到它的布局无效并且需要重新计算。如果这种情况没有发生,或者由于某种原因您还需要重新验证父容器,请调用相关组件上的 invalidate() 方法。

关于java - 如何完全删除(核武器)javax.swing.box?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422104/

相关文章:

java - 使所有 JButton 都带有圆角的最佳方法

java - 从 Google App 引擎备份和恢复实体

Java - 对多种类型使用泛型

java - 绘制分层形状

java - JList DefaultListModel ListSelectionListener

java - 如何在不知道行 UNTIL CREATION 的情况下将 JButton (JAVA) 文本拆分为多行

java - 获取按钮的变量名

java - Spring事务管理测试

java - 如何使用java创建虚拟串口

java - 在保留插图的 Java Swing 中更改 JButton 的边框颜色