我正在尝试创建一个应用程序,但目前有点困在如何整齐地构建我的代码。
为简单起见,假设我想要一个包含以下内容的JFrame
:
JPanel
,其中包含JComboBox
,用户可在其中选择形状(方形,圆形等)。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();
}
}
ComboBoxPanel:
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
}
}
简而言之,我怎样才能让这两个相同级别的组件以一种巧妙的方式相互交互?我想过一些解决方案,但看起来很脏。欢迎任何想法。
感谢。
答案 0 :(得分:2)
如果您的ComboBoxPanel
和ShapePanel
都位于同一个JFrame中,则它们应该彼此“看到”。从那里,您可以使用两个类中的getter和setter来访问彼此的属性。
如果你在谈论不相关的类,你总是可以采用一种设计模式,例如Observer模式,其中类签订合同并通过方法公开感兴趣的行为。
我在这里使用 观察者模式 写了一个详细的例子:Updating Change to another class
如果您有兴趣将用户界面和逻辑实现分开。 MVC 是另一种可行的选择。您的模型仅包含您的逻辑和数据,查看仅包含您的用户界面。
模型和查看不需要知道彼此的存在。您将使用控制器链接视图和模型。这样它可以极大地解耦代码。因此,如果您决定更改逻辑,有一天UI就不会受到影响。
如果您决定更改UI,逻辑也不会受到影响。
甚至可以将Observer模式和MVC结合起来。毕竟,这取决于你想要达到的目标。
答案 1 :(得分:0)
我建议阅读观察者模式或mvc模式。最好的解决方案可能是mvc。在MVC(模型,视图,控制器)中,您可以在视图之外(两个jpanel)保存模型(您的数据)。然后,因为两个面板共享相同的数据,所以很容易从输入面板驱动显示面板。