gpt4 book ai didi

java - 让两个同级的 Swing 组件交互

转载 作者:行者123 更新时间:2023-11-30 03:00:39 24 4
gpt4 key购买 nike

我正在尝试制作一个应用程序,但目前对如何整齐地构建我的代码有点困惑。

为了简单起见,假设我想要一个包含以下内容的 JFrame:

  1. 一个 JPanel,其中包含一个 JComboBox,用户可以在其中选择形状(方形、圆形等)。
  2. 一个单独的 JPanel,用于直观地显示 JComboBox 中选定的形状。

所以我有以下代码:

public class Frame extends JFrame {

Frame() {
ComboBoxPanel comboBoxPanel = new ComboBoxPanel();
ShapePanel shapePanel = new ShapePanel();

this.getContentPane().add(comboBoxPanel, BorderLayout.WEST);
this.getContentPane().add(shapePanel, BorderLayout.CENTER);

this.setResizable(true);
this.pack();
this.setVisible(true);
}

public static void main(String[] args) {
new Frame();
}
}

组合框面板:

public class ComboBoxPanel extends JPanel {

private JComboBox<Shape> comboBox;

ComboBoxPanel() {
comboBox = new JComboBox<Shape>(Shape.SHAPES);
this.add(comboBox);

comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
// Here I want to repaint the shapePanel
}
}
});
}
}

最后,ShapePanel 将如下所示:

public class ShapePanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
// Get selected Shape from JComboBox and draw it
}
}

简而言之,如何让这两个同级组件以一种简洁的方式交互?我已经想到了一些解决方案,但它们看起来很脏。欢迎任何想法。

谢谢。

最佳答案

如果您的 ComboBoxPanelShapePanel 都驻留在同一个 JFrame 中,那么它们应该能够“看到”彼此。从那里,您可以使用两个类中的 getter 和 setter 来访问彼此的属性。

如果您正在谈论不相关的类,您始终可以采用一种设计模式,例如观察者模式,其中类签署契约并通过方法公开感兴趣的行为。

我在这里使用观察者模式编写了一个详细的示例:Updating Change to another class

<小时/>

如果您有兴趣将用户界面和逻辑实现分开。 MVC 是另一个可行的选择。您的模型将仅包含您的逻辑和数据,您的 View 仅包含您的UI。

模型 View 不需要知道彼此的存在。您将使用链接 View 和模型的 Controller 。这样可以极大地解耦你的代码。因此,有一天,如果您决定更改逻辑,用户界面不会受到影响。

如果您决定更改用户界面,逻辑也不会受到影响。

<小时/>

甚至可以将观察者模式和 MVC 结合起来。毕竟,这取决于您想要实现的目标。

关于java - 让两个同级的 Swing 组件交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087619/

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