我正在用NetBeans编写Java。我有个奇怪的问题。在类鼠标监听器中,我对面板执行getComponents,它返回一个组件数组,我将这些组件放在(?)在一个数组JButton (whit cast)中,所以..
JButton[] b= (JButton[])Main.p1.getComponents();IDE不显示错误。我这样做,例如:
b[0].setBackground(Color.yellow); 在输出中我看到了一个错误。
但如果我这么做了
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]; }
但是在输出中我看到了这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JLabel cannot be cast to Button为什么是JLabel?
气垫船装满了黄鱼,谢谢你的回答,我可以创建一个数组,并将所有按钮的指针插入其中。但是我说: JPannel有一个数组,其中插入指针..我可以用它。为什么不行?非常感谢!
Alessandro Amedei
发布于 2015-01-17 22:11:22
在第一种情况下,你是在欺骗编译器。通过陈述
JButton[] b= (JButton[])Main.p1.getComponents();您告诉编译器,您知道这是一个JButtons数组,而实际上它实际上是一个Components数组。因此,您不会得到编译时错误,但您会在运行时得到一个错误。
在另一种情况下,它可以工作,因为您告诉编译器您想要使用的Component是一个JButton,这是真的。
发布于 2015-01-17 22:22:25
这是因为JComponent的数组和JButton的数组不同。如果你想最终得到按钮数组,你需要在循环中一个接一个地进行转换:
JButton[] buttons = new JButton[components.length];
for (int i = 0; i < components.length; i++) {
buttons[i] = (JButton) components[i];
}发布于 2015-01-17 23:03:11
我担心您试图通过迭代组件数组来提取选定的JButton,从而使您的程序逻辑基于GUI组件结构,这是一种非常脆弱的操作方式。如果您更改了周围的组件,或者后来决定将一个包含您的JButtons的容器嵌套到另一个容器(即,另一个JPanel)中,您将不得不小心更新此侦听器和所有类似的侦听器,这也会使您的代码变得非常脆弱。
与其这样做,更好的解决方案可能是将侦听器添加到需要它们的各个组件中。例如,如果您希望在鼠标悬停在某个JButton上时将其背景更改为黄色,请考虑向每个JButton添加一个ChangeListener,通过ChangeEvent的getSource()方法提取所涉及的按钮,然后测试该按钮的模型以查看它是否处于滚动状态。例如:
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();
}
});
}
}https://stackoverflow.com/questions/28000265
复制相似问题