在 JPanel.getComponents() 中循环时如何获取 JButton 属性

Posted

技术标签:

【中文标题】在 JPanel.getComponents() 中循环时如何获取 JButton 属性【英文标题】:How to get JButton properties when looping inside a JPanel.getComponents() 【发布时间】:2015-06-29 11:03:28 【问题描述】:

我有一个 JPanel,其中填满了 JButton。

void addMealsMenuBarTitles() 

    JToggleButton test;
    int i=0;

    for (Categoria c: categories.categorias) 
        test = new JToggleButton(c.categoria);
        test.setForeground(Color.white);
        test.setBackground(new Color(52, 152, 219));
        test.setSize(new Dimension(menuMealsBar.getWidth()/categories.categorias.size(), menuMealsBar.getHeight()));
        test.setLocation(i++*(test.getWidth()), 0);
        menuMealsBar.add(test);
    


我想要做的是在循环通过该 JPanel 的组件时访问 JButtons 的属性(边框)

void addClickEventCategories() 
    for (Component jtb: menuMealsBar.getComponents())

        jtb.addMouseListener(new MouseListener() 

        @Override
        public void mouseClicked(MouseEvent e) 
            //jtb.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.white));
        

        @Override public void mousePressed(MouseEvent e) 

        @Override public void mouseReleased(MouseEvent e) 

        @Override public void mouseEntered(MouseEvent e) 

        @Override public void mouseExited(MouseEvent e) 
    );

我得到的错误是组件没有 BorderProperty(显然)......我怎样才能解决这个问题?

【问题讨论】:

我试图这样做:for (Component jtb: (JToggleButton[])menuMealsBar.getComponents()) 但它没有用。它在运行时崩溃 【参考方案1】:

您可能应该使用更像...的东西

for (Component comp: menuMealsBar.getComponents()) 
    if (comp instanceof JToggleButton) 
         JToggleButton jtb = (JToggleButton)comp;

因为您不应该对容器实际包含的内容做出假设(很多时候您会感到惊讶;))

另一种解决方案可能是在 mouseClicked 方法中执行类似的操作

@Override
public void mouseClicked(MouseEvent e) 
    Component comp = e.getComponent();
    if (comp instanceof JToggleButton) 
        JToggleButton jtb = (JToggleButton)comp;
        jtb.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.white));
    

【讨论】:

1.如果我这样做,jtb 不会更改 comp,因为我只是在实例化一个新对象。 2.我无法在if内部实例化一个变量 没有创建新对象,您只是根据您对对象类型的调查从Component 转换为JToggleButton... 天啊!!有效!谢谢! (我怎样才能将你标记为答案?我对这个论坛有点n00b)......也许你可以帮我解决最后一个“谜语”。我希望当我单击按钮时,它会将其边框更改为白色,但我希望其余的也禁用它们的边框。有点像单选按钮 这有点困难,因为您需要知道组中的所有按钮。您可以使用ButtonGroup 并监控按钮的selected 状态,并根据选择的按钮进行更改 k!我无法使用抽象按钮,所以......我发现了这种循环方式,不是最好的!但它确实有效:【参考方案2】:
    @Override
    public void mouseClicked(MouseEvent e) 
        //jtb.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.white));
    

可以从 MouseEvent 中获取组件:

    @Override
    public void mouseClicked(MouseEvent e) 
        JToggleButton button = (JToggleButton)e.getSource();
        button.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.white));
    

【讨论】:

我喜欢它@camickr ...我应该把这个覆盖放在哪里? JPanel?

以上是关于在 JPanel.getComponents() 中循环时如何获取 JButton 属性的主要内容,如果未能解决你的问题,请参考以下文章

JComponent 绘制前的高度

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?