首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cast Component[] -> JButton

Cast Component[] -> JButton
EN

Stack Overflow用户
提问于 2015-01-17 22:06:45
回答 3查看 4K关注 0票数 0

我正在用NetBeans编写Java。我有个奇怪的问题。在类鼠标监听器中,我对面板执行getComponents,它返回一个组件数组,我将这些组件放在(?)在一个数组JButton (whit cast)中,所以..

代码语言:javascript
复制
JButton[] b= (JButton[])Main.p1.getComponents();

IDE不显示错误。我这样做,例如:

代码语言:javascript
复制
b[0].setBackground(Color.yellow); 

在输出中我看到了一个错误。

但如果我这么做了

代码语言:javascript
复制
JButton b= (JButton) Main.p1.getComponents()[0];

b.setBackground(...);

所有的工作,但我不明白为什么。有人能解释一下吗?

2015-01-18

感谢所有人的回答。我想要一个面板的组成部分,不仅为改变背景的颜色,也为坐标;我需要在一个数组中的所有按钮来比较所有在同一时间。为什么我不能将'Components‘转换成’Button‘?面板上有一个指向Ram内存中按钮的指针。Patryk Dobrowolski谢谢你,我尝试这样做:(我使用类按钮扩展JButton)

Button[] button = new Button[Main.p1.getComponents().length]; for (int i = 0; i < Main.p1.getComponents().length; i++) { button[i] = (Button) Main.p1.getComponents()[i]; }

但是在输出中我看到了这个错误:

代码语言:javascript
复制
 Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JLabel cannot be cast to Button

为什么是JLabel?

气垫船装满了黄鱼,谢谢你的回答,我可以创建一个数组,并将所有按钮的指针插入其中。但是我说: JPannel有一个数组,其中插入指针..我可以用它。为什么不行?非常感谢!

Alessandro Amedei

EN

回答 3

Stack Overflow用户

发布于 2015-01-17 22:11:22

在第一种情况下,你是在欺骗编译器。通过陈述

代码语言:javascript
复制
JButton[] b= (JButton[])Main.p1.getComponents();

您告诉编译器,您知道这是一个JButtons数组,而实际上它实际上是一个Components数组。因此,您不会得到编译时错误,但您会在运行时得到一个错误。

在另一种情况下,它可以工作,因为您告诉编译器您想要使用的Component是一个JButton,这是真的。

票数 2
EN

Stack Overflow用户

发布于 2015-01-17 22:22:25

这是因为JComponent的数组和JButton的数组不同。如果你想最终得到按钮数组,你需要在循环中一个接一个地进行转换:

代码语言:javascript
复制
JButton[] buttons = new JButton[components.length];
for (int i = 0; i < components.length; i++) {
   buttons[i] = (JButton) components[i];
}
票数 2
EN

Stack Overflow用户

发布于 2015-01-17 23:03:11

我担心您试图通过迭代组件数组来提取选定的JButton,从而使您的程序逻辑基于GUI组件结构,这是一种非常脆弱的操作方式。如果您更改了周围的组件,或者后来决定将一个包含您的JButtons的容器嵌套到另一个容器(即,另一个JPanel)中,您将不得不小心更新此侦听器和所有类似的侦听器,这也会使您的代码变得非常脆弱。

与其这样做,更好的解决方案可能是将侦听器添加到需要它们的各个组件中。例如,如果您希望在鼠标悬停在某个JButton上时将其背景更改为黄色,请考虑向每个JButton添加一个ChangeListener,通过ChangeEvent的getSource()方法提取所涉及的按钮,然后测试该按钮的模型以查看它是否处于滚动状态。例如:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class SetButtonBackground extends JPanel {

   public static final Color ROLLOVER_COLOR = Color.yellow;

   public SetButtonBackground() {
      int rows = 5;
      int cols = rows;
      setLayout(new GridLayout(rows, cols, 5, 5));

      ButtonChangeListener btnChngListener = new ButtonChangeListener();
      for (int i = 0; i < rows * cols; i++) {
         String text = "Button " + (i + 1);
         JButton button = new JButton(text);
         button.addChangeListener(btnChngListener);
         add(button);
      }
   }

   private class ButtonChangeListener implements ChangeListener {
      @Override
      public void stateChanged(ChangeEvent e) {
         JButton btn = (JButton) e.getSource();
         ButtonModel model = btn.getModel();
         if (model.isRollover()) {
            if (!btn.getBackground().equals(ROLLOVER_COLOR)) {
               btn.setBackground(ROLLOVER_COLOR);
            }
         } else if (btn.getBackground().equals(ROLLOVER_COLOR)) {
            btn.setBackground(null); // change back to default state
         }
      }
   }

   private static void createAndShowGui() {
      SetButtonBackground mainPanel = new SetButtonBackground();

      JFrame frame = new JFrame("Set Button Background");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28000265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档