让两个相同级别的Swing组件进行交互

时间:2016-03-18 14:58:20

标签: java swing components

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

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

  1. JPanel,其中包含JComboBox,用户可在其中选择形状(方形,圆形等)。
  2. 单独JPanel,可在JComboBox
  3. 中直观显示所选形状

    所以我有以下代码:

    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
        }
    }
    

    简而言之,我怎样才能让这两个相同级别的组件以一种巧妙的方式相互交互?我想过一些解决方案,但看起来很脏。欢迎任何想法。

    感谢。

2 个答案:

答案 0 :(得分:2)

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

如果你在谈论不相关的类,你总是可以采用一种设计模式,例如Observer模式,其中类签订合同并通过方法公开感兴趣的行为。

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

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

模型查看不需要知道彼此的存在。您将使用控制器链接视图和模型。这样它可以极大地解耦代码。因此,如果您决定更改逻辑,有一天UI就不会受到影响。

如果您决定更改UI,逻辑也不会受到影响。

甚至可以将Observer模式和MVC结合起来。毕竟,这取决于你想要达到的目标。

答案 1 :(得分:0)

我建议阅读观察者模式或mvc模式。最好的解决方案可能是mvc。在MVC(模型,视图,控制器)中,您可以在视图之外(两个jpanel)保存模型(您的数据)。然后,因为两个面板共享相同的数据,所以很容易从输入面板驱动显示面板。

相关问题