Java 如何强制转换我的面板以访问类方法以返回对象?

Java 如何强制转换我的面板以访问类方法以返回对象?,java,swing,casting,Java,Swing,Casting,因此,我正在为GUI编写一个程序,我一直在研究如何铸造一个面板,该面板是我通过另一个类的方法创建的,并传递回另一个类。本质上,我有相当多的类和方法来创建类似的对象以放在多个面板上(也通过方法创建)。现在我想访问我在每个不同面板上创建的每个按钮 所以在这个makeComponents类中,我创建了一个JSlider对象 class makeComponents implements ActionListener { private JPanel dimPanel;

因此,我正在为GUI编写一个程序,我一直在研究如何铸造一个面板,该面板是我通过另一个类的方法创建的,并传递回另一个类。本质上,我有相当多的类和方法来创建类似的对象以放在多个面板上(也通过方法创建)。现在我想访问我在每个不同面板上创建的每个按钮

所以在这个
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创建的特定JSlider
brightness
。然后在下面的类中是另一个容器面板,它将容纳这个面板和另一个面板

    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
中声明的面板。我刚刚将其添加到上述代码中。