【问题标题】:JPanel is added onto other Jpanel on togglebutton ClickJPanel 被添加到其他 Jpanel on togglebutton Click
【发布时间】:2019-07-31 15:39:50
【问题描述】:

我正在尝试制作一个在 JToggleButton 的帮助下激活的弹出面板。 我希望在选择 ToggleButton 时将 JPanel 添加到另一个 Jpanel 并在取消选择 ToggleButton 时隐藏。

我已经声明了 JToggleButton 并使用了 ItemListener。但是发生的情况是,当我选择 ToggleButton 时,如果我取消选择并再次选择它,则会创建一个面板,然后再次添加另一个 JPanel,依此类推,点击 5 次后,什么都没有出现。

public static JPanel createDesignButtons(){
    designButtonsPanel.setOpaque(false);
    BoxLayout boxLayout = new BoxLayout(designButtonsPanel, BoxLayout.LINE_AXIS);
    designButtonsPanel.setLayout(boxLayout);

    mainButton.setIcon(Icons.venueIcon);
    mainButton.setBorderPainted(false);
    mainButton.setPreferredSize(new Dimension(40,40));
    mainButton.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent ev) {
        if(ev.getStateChange()==ItemEvent.SELECTED){
        designButtonsPanel.add(createButtonsDialog());
        designButtonsPanel.validate();
        } else if(ev.getStateChange()==ItemEvent.DESELECTED){
        System.out.println("button is not selected");
        }
    }
});
    designButtonsPanel.add(mainButton);

    JLabel padding = new JLabel(" ");
    padding.setPreferredSize(null);

    JLabel divider = new JLabel("", Icons.dividerIcon, JLabel.CENTER);
    divider.setPreferredSize(new Dimension(3,45));
    designButtonsPanel.add(divider);


    SwingUtilities.updateComponentTreeUI(designButtonsPanel);
    return(designButtonsPanel);
}

上面的代码显示 mainButton 是我想要操作的切换按钮,而 DesignButtonPanel 是父面板。

public static JPanel createButtonsDialog(){

    JPanel buttonsPanel = new JPanel();
    buttonsPanel.setBorder(new LineBorder(Color.gray,1));
    return buttonsPanel;
}

这个类显示我想添加到父面板的面板

如何在选择 JtoggleButton 时只添加一次面板并在取消选择时隐藏?

【问题讨论】:

    标签: java swing popup jbutton jdialog


    【解决方案1】:

    问题是您不断创建JPanel 的实例。 如果您的JToggleButton 未被选中,您可以remove JPanel 并添加一个已创建的JPanel 实例(如果选择了该按钮)。 看这个简单的例子:

    public class MainFrame extends JFrame {
    
    private JPanel topPanel = new JPanel();
    private JPanel centerPanel = new JPanel();
    private JToggleButton toggleButton = new JToggleButton("Toggle");
    
    public MainFrame() {
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
    
        this.topPanel.setPreferredSize(new Dimension(100, 100));
        this.centerPanel.setPreferredSize(new Dimension(100, 100));
        this.toggleButton.setPreferredSize(new Dimension(100, 100));
    
        this.add(topPanel, BorderLayout.NORTH);
        this.add(centerPanel, BorderLayout.CENTER);
        this.add(toggleButton, BorderLayout.SOUTH);
    
        this.toggleButton.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    add(centerPanel, BorderLayout.CENTER);
                } else {
                    remove(centerPanel);
                }
                pack();
            }
        });
    
        this.pack();
        this.setVisible(true);
    }
    }
    

    你可以看到centerPanel只被实例化了一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2012-03-08
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多