Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPanel.getComponents()内循环时获取JButton属性_Java_Swing_Jpanel_Components_Jbutton - Fatal编程技术网

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

Java 如何在JPanel.getComponents()内循环时获取JButton属性,java,swing,jpanel,components,jbutton,Java,Swing,Jpanel,Components,Jbutton,我有一个JPanel,里面装满了JButtons void addMealsMenuBarTitles() { JToggleButton test; int i=0; for (Categoria c: categories.categorias) { test = new JToggleButton(c.categoria); test.setForeground(Color.white); test.setBack

我有一个JPanel,里面装满了JButtons

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 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));
    }
}
您可以从MouseeEvent获取组件:

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

我尝试过这样做:for(Component jtb:(JToggleButton[])menuMealsBar.getComponents()),但没有成功。它在运行时崩溃1。如果我这样做,jtb将不会更改comp,因为我只是实例化一个新对象。2.我无法在内部实例化变量,如果没有创建新对象,则根据您对对象类型的调查,您只需从
组件
转换为
JToggleButton
。…Jezz!!成功了!谢谢(我怎样才能把你标记为答案?我对这个论坛有点陌生)。。。也许你能帮我解开最后一个“谜”。我希望当我点击按钮时,它会将其边框更改为白色,但我希望其他人也禁用其边框。有点像一个收音机按钮,这有点难,因为你需要知道组中的所有按钮。您可以使用
按钮组
,监视按钮的
选定状态
,并根据选择的按钮进行更改。k!我无法使用抽象按钮,所以。。。我发现这是一种迂回的方法,不是最好的!但它确实有效:我喜欢它@camickr。。。我应该把这个超控装置放在哪里?JPanel?
    @Override
    public void mouseClicked(MouseEvent e) {
        JToggleButton button = (JToggleButton)e.getSource();
        button.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.white));
    }