【问题标题】:JXTitledPanels in a JPanel a user needs to be able to choose one and click a remove buttonJXTitledPanels 在 JPanel 中,用户需要能够选择一个并单击删除按钮
【发布时间】:2012-08-23 13:13:24
【问题描述】:

我有一个JPanel,其中有 n 个JXTitledPanels。用户应该能够单击JXTitledPanel 并点击删除按钮将其删除。

我的问题是我怎么知道JXTitlePanel 用户选择了什么。

here 是我程序中的一个屏幕,基本上我希望用户单击“医院”,单击删除,医院表将消失。

【问题讨论】:

  • 如需更好的帮助,请尽快发帖SSCCE
  • 由于您可以使用JPanel#add 方法添加这些面板,我建议使用JPanel#remove 方法。如果没有 SSCCE,就很难给出更具体的建议
  • i 平面使用 JPanel#remove。但我不确定如何确定要删除哪个 titledPane。
  • 您可能会重新考虑用户体验:她/他必须单击面板上的某处(其标题区域?)然后单击其他位置(相对于面板较远)以删除最后一次单击(破坏性行动) - 没有任何关于将被破坏的东西的视觉线索。 设计了一个 titledPanel 来支持这样的操作在一个位置 ...请参阅@MadProgrammer 的答案。即使您决定不遵循它,您也必须至少添加一些视觉线索(例如更改背景)关于哪个是“选定”目标面板
  • @kleopatra 是的,这也是我担心的事情。我考虑将 titlepainter 更改为红色或橙色以显示所选表格。我还计划返回并禁用您还不能使用的按钮。 (如果没有选择你,删除按钮将被禁用)

标签: java swing jpanel swingx


【解决方案1】:

我可能会在正确的装饰位置添加一个“删除”控件。这样,您可以传递对 JXTiltedPane 控件的引用

titledPane.addRightDecoration(new MyRemoveControl(titkedPane));

这样的

【讨论】:

  • 是的 - 除了你不需要参考:沿着层次结构向上走,直到找到一个 JXTitledPane 的父 :-)
  • @kleopatra 你可以戴帽子,但我很懒 ;) - 会通过强引用阻止可能的内存链接
  • @MadProgrammer 我对你的意思感到困惑。
  • @Phox 如果您将 JXTiledPane 的引用传递给控件,​​您将面临创建内存链接的风险,因为该控件正在维护对 JXTiledPane 的强引用。就其本身而言,这可能不是问题,但这只是另一个潜在的风险,可能会阻止组件被车库收集
  • @MadProgrammer 起初我不太确定你的意思(我没有使用 JXTitledPanels 的经验)。将删除添加到控件后,我还添加了编辑和上下移动按钮。效果很好!
【解决方案2】:

@madprogrammer 可能有最简单的答案,但如果您不想更改应用程序的外观,您可以将按钮的actionListener 与面板的mouseListener 结合使用。

mouseListener 部分保存最后点击的面板,actionListener 只是删除由mouseListener 注册的面板。

这是我制作的一个快速示例 - 它不使用 JXTitledPane 但这不重要,因为它们都在同一个层次结构中。

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

public class TempProject extends JFrame{

    public TempProject(){
        Box mainContent = Box.createVerticalBox();

        //Create Button
        JButton removePanel = new JButton("RemovePanel");
        RemoveListener listener = new RemoveListener(mainContent);
        removePanel.addActionListener(listener);
        mainContent.add(removePanel);

        //Create Panels
        mainContent.add(getPanel(Color.red, listener));
        mainContent.add(getPanel(Color.orange, listener));
        mainContent.add(getPanel(Color.pink, listener));
        mainContent.add(getPanel(Color.magenta, listener));

        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setContentPane(mainContent);    
        pack();
        setVisible(true);
    }

    public JPanel getPanel(Color color, RemoveListener l){
        JPanel result = new JPanel();
        result.setBackground(color);
        result.add(new JLabel(color.toString()));
        result.addMouseListener(l);
        return result;
    }

    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new TempProject();
            }
        });
    }

    public static class RemoveListener extends MouseAdapter implements ActionListener{

        Component lastSelectedComponent = null;
        Container master; //The panel containing the ones being listened to

        public RemoveListener(Container master){
            this.master = master;
        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            lastSelectedComponent = (Component)arg0.getSource();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if(lastSelectedComponent != null){
                master.remove(lastSelectedComponent);
                master.repaint();
            }
        }

    }

}

【讨论】:

  • 可能但太低级(尤其是在 JXTitledPane 的上下文中)-并根据可用性查看我对问题的评论:)
  • 唯一让我担心的是我的公司框架。他们使用修改后的 MVC,所有侦听器都必须作为不同包中的单独类实现,并扩展其自定义操作。
  • @kleopatra 我完全同意可用性(疯狂程序员的回答是我会走的路)。这种替代方式只是解决了确切的问题——以防万一有一些愚蠢的理由不能这样做。
  • @Phox 这个框架会让事情变得有点复杂。本质上不是将它们组合成一个类,而是必须使用顶级类来存储每种类型的侦听器的信息和子类(子类可以扩展您公司的侦听器)。如果 Java 支持多态会更容易......(改天的话题)。
猜你喜欢
  • 2013-11-27
  • 2023-01-05
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2019-12-09
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多