如何组织JavaSwing应用程序体系结构?

如何组织JavaSwing应用程序体系结构?,java,swing,netbeans,Java,Swing,Netbeans,我正在用Java做一个小项目。从设计上看,该应用程序将类似于QTranslate——它是用于各种翻译API的GUI。应用程序将有1个主窗体、翻译器本身和几个辅助窗体(设置、语言选择、保存的单词等)。 目前还不清楚如何实现辅助形式与主形式的交互?每个辅助形式都会影响主形式。例如,当选择一种语言时,一个新按钮将添加到主窗体中。或者在更改设置时,热键将更改。每个表单都是一个单独的类。我是否正确地理解了实现这一点的唯一方法是使主窗体类成为静态的,并从辅助窗体的其他非静态类访问它 我的应用程序截图 我认为

我正在用Java做一个小项目。从设计上看,该应用程序将类似于QTranslate——它是用于各种翻译API的GUI。应用程序将有1个主窗体、翻译器本身和几个辅助窗体(设置、语言选择、保存的单词等)。 目前还不清楚如何实现辅助形式与主形式的交互?每个辅助形式都会影响主形式。例如,当选择一种语言时,一个新按钮将添加到主窗体中。或者在更改设置时,热键将更改。每个表单都是一个单独的类。我是否正确地理解了实现这一点的唯一方法是使主窗体类成为静态的,并从辅助窗体的其他非静态类访问它

我的应用程序截图


我认为,将主窗体类设为静态并不是合适的面向对象方法。相反,我会将主容器传递给辅助表单类的构造函数,这更像是OOP方式

示例代码(父帧):

示例代码(子帧):


这只是创建一个带有按钮的父帧,该按钮打开一个带有按钮的子帧。如果单击子框架中的按钮,则会更改父框架的背景颜色。

是否从主窗体调用“辅助窗体”?如果你想使用辅助表单。你可能想读这个:考虑使用<代码>子帧。你必须设置父帧的ContentPane,比如::代码> PARTHONCELL。code>然后调用
frame.setContentPane(parentContainer)此邮件的收件人是谁?“这是怎么回事?”Tsudzukeru问他在添加按钮时做错了什么,但我认为他删除了他的评论,很抱歉造成混乱
  public class ParentFrame extends JFrame {
    public ParentFrame() {
    this.setSize(400, 100);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new FlowLayout(FlowLayout.CENTER));

    JButton button = new JButton("Open Window");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        new ChildFrame(getContentPane()).setVisible(true);
      }
    });
    this.getContentPane().add(button);
  }
  public static void main(String[] args) {
    new ParentFrame().setVisible(true);
  }
}
public class ChildFrame extends JFrame {
  private Container parentContainer;
  public ChildFrame(Container parentContainer) {
    this.parentContainer = parentContainer;
    this.setSize(400, 100);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new FlowLayout(FlowLayout.CENTER));
    JButton button = new JButton("Change Frame Color");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        JFrame frame = (JFrame) SwingUtilities.getRoot(parentContainer);
        frame.getContentPane().setBackground(Color.RED);
      }
    });
    this.getContentPane().add(button);
  }
}