Java 如何强制转换我的面板以访问类方法以返回对象?
因此,我正在为GUI编写一个程序,我一直在研究如何铸造一个面板,该面板是我通过另一个类的方法创建的,并传递回另一个类。本质上,我有相当多的类和方法来创建类似的对象以放在多个面板上(也通过方法创建)。现在我想访问我在每个不同面板上创建的每个按钮 所以在这个Java 如何强制转换我的面板以访问类方法以返回对象?,java,swing,casting,Java,Swing,Casting,因此,我正在为GUI编写一个程序,我一直在研究如何铸造一个面板,该面板是我通过另一个类的方法创建的,并传递回另一个类。本质上,我有相当多的类和方法来创建类似的对象以放在多个面板上(也通过方法创建)。现在我想访问我在每个不同面板上创建的每个按钮 所以在这个makeComponents类中,我创建了一个JSlider对象 class makeComponents implements ActionListener { private JPanel dimPanel;
makeComponents
类中,我创建了一个JSlider对象
class makeComponents implements ActionListener {
private JPanel dimPanel;
private JSlider brightness;
public makeComponents() {
}
...
public JPanel DimSlider(int num) {
dimPanel = new JPanel(new GridBagLayout()) {
@Override
public Dimension getMaximumSize() {
Dimension max = super.getMaximumSize();
max.height = getPreferredSize().height;
return max;
}
};
...
brightness = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
dimPanel.add(brightness);
...
return dimPanel;
}
...
public JSlider passBrightnessfromDimSlider() {
return brightness;
}
}
在另一个类的另一个方法中,createCPanel
,我调用了dimsslider方法来创建一个dimPanel
,以添加到此容器面板。这就是我得到java.lang.ClassCastException的地方:makeComponents$1不能转换为makeComponents。但是,删除此项也不起作用
class lightPanel extends JPanel {
private JPanel dimPanel1;
private JSlider dimmer1;
public lightPanel(int room_num) {
...
dimPanel1 = new makeComponents.DimSlider(1);
dimmer1 = ((makeComponents) dimPanel1).passBrightnessfromDimSlider();
...
}
public JSlider passDimmer1() {
return dimmer1;
}
在上面,我尝试传递为dimPanel1创建的特定JSliderbrightness
。然后在下面的类中是另一个容器面板,它将容纳这个面板和另一个面板
class createCPanel extends JPanel {
private JPanel lightPanel;
private JSlider brightSlider1;
...
public createCPanel(int num) {
...
lightPanel = new lightPanel(num);
brightSlider1 = ((lightPanel) lightPanel).passDimmer1();
...
}
public JSlider getbrightSlider1() {
return brightSlider1;
}
}
然后我有另一个面板,把所有的东西都放在一起!这就是我试图访问每个特定JSlider的地方,我通过DimSlider
方法创建了所有不同的JSlider
class Panel extends JPanel implements ActionListener {
private JPanel rooma;
public Panel() {
rooma = new createCPanel(1);
...
((createCPanel) rooma).getbrightSlider1().addChangeListener(...);
}
}
因此,在这些不同的面板上有很多不同的组件,它们都有不同的功能,我需要参考特定面板中的每个特定组件。然而,我在lightPanel
方法中得到了ClassCastException。有没有人对如何解决这个问题有任何其他想法,或者提出更好的访问这些组件的方法
顺便说一句,理想情况下,为了组织的缘故,我不想把所有的东西都放在一个类下。我有很多方法,但我想如果这是唯一的选择,那么我就别无选择
提前谢谢你
public lightPanel(int room_num) {
...
dimPanel1 = new makeComponents.DimSlider(1);
dimmer1 = ((makeComponents) dimPanel1).passBrightnessfromDimSlider();
...
}
dimpanel 1
是一个JPanel。通过说(makeComponents)dimPanel1
,您基本上是在尝试将一个JPanel转换为一个makeComponents,而这是无法完成的
执行此操作时:
JPanel panel = new makeComponents().DimSlider(1);
您创建的makeComponents
仅用于调用其上的方法DimSlider
,并立即被丢弃。没有办法回忆起它
要在自己的代码中真正做到您想做的事情,您需要做的是:
public lightPanel(int room_num) {
...
makeComponents factory = new makeComponents();
dimPanel1 = factory.DimSlider(1);
dimmer1 = factory.passBrightnessfromDimSlider();
...
}
但是。。。不要以这种方式创建GUI。很奇怪,很乱
// can you spot the error?
public lightPanel(int room_num) {
...
makeComponents factory = new makeComponents();
dimmer1 = factory.passBrightnessfromDimSlider();
dimPanel1 = factory.DimSlider(1);
...
}
只要这样做:
class LightPanel extends JPanel {
private JPanel dimPanel;
private JSlider dimmer;
public LightPanel(int roomNum) {
...
dimPanel = new JPanel(new GridBagLayout()) {
@Override
public Dimension getMaximumSize() {
Dimension max = super.getMaximumSize();
max.height = getPreferredSize().height;
return max;
}
};
...
dimmer = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
dimPanel.add(dimmer);
...
}
}
或者这个:
class DimPanel extends JPanel implements ActionListener {
private JSlider brightness;
public DimPanel() {
super(new GridBagLayout());
...
brightness = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
add(brightness);
}
@Override
public Dimension getMaximumSize() {
Dimension max = super.getMaximumSize();
max.height = getPreferredSize().height;
return max;
}
public int getBrightness() {
return brightness.getValue();
}
}
我看不出
dimPanel
(在makeComponents
中)在哪里被分配给任何东西。我肯定它在某个地方,但在代码中你没有包括。如果我们看到它可能会有所帮助。哦,makeComponents
中的dimPanel
只是一个带有GridBagLayout
的新JPanel。它用于makeComponents
中的DimSlider
方法中,以包含所有滑块和其他按钮/标签。在lightPanel
中,调用DimSlider
方法来创建DimSlider面板,并将其传递回我在lightPanel
中声明的面板。我刚刚将其添加到上述代码中。