如何构建我的面板来访问类方法以返回一个对象?

时间:2013-11-19 03:47:54

标签: java swing casting

所以我正在编写一个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中的另一个方法中,我调用了DimSlider方法来创建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;
        }

    }

然后我有另一个把所有东西放在一起的面板!这就是我尝试通过DimSlider方法访问我创建的所有不同JSlider的地方。

    class Panel extends JPanel implements ActionListener {
        private JPanel rooma;

        public Panel() {
            rooma = new createCPanel(1);
            ...
            ((createCPanel) rooma).getbrightSlider1().addChangeListener(...);
        }
    }

因此,这些不同的面板上有许多不同的组件,所有这些组件都具有不同的功能,我需要参考该特定面板中的每个特定组件。但是,我在lightPanel方法中得到了ClassCastException。有没有人有任何其他想法如何解决这个或建议更好的方式来访问这些组件?

P.S。理想情况下,为了组织起见,我不想把所有东西放在一个班级下面。我有很多方法,但我想如果那是唯一的选择那么我别无选择。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

public lightPanel(int room_num) {
    ...
    dimPanel1 = new makeComponents.DimSlider(1);
    dimmer1 = ((makeComponents) dimPanel1).passBrightnessfromDimSlider();
    ...
}

dimPanel1是一个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();
    }
}