如何完全删除 (nuke) a javax.swing.box?
How to remove (nuke) a javax.swing.box entirely?
我有一个 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()
方法。
我有一个 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()
方法。