gpt4 book ai didi

java - 如何强制面板访问类方法以返回对象?

转载 作者:行者123 更新时间:2023-11-30 04:09:04 27 4
gpt4 key购买 nike

所以我正在为 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 的每个特定 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();
...
}

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();
}
}

关于java - 如何强制面板访问类方法以返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20062790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com