Java 中的实例

Instances in Java

我有4个类; RunSOMyGUIMyMenuBarNumberSettingsFile。我在 MyGUIMyMenuBar 中有一个 NumberSettingsFile 的实例。问题是它们是单独的实例,所以当我在一个实例中使用方法时,它不会更新第二个实例中的值。我的问题是如何让这些实例协同工作。例如,如果我将 sortComboBox 的值设置为 11。它更新 MyMenuBarNumberSettingsFile 的实例,但不更新 MyGUI 中的实例。所以当按下按钮时,给定的值仍然是 10。我如何让它在这两种情况下更新值,以便当我按下按钮时它会给出值 11 (在这种情况下)。

4类的代码如下。

NumberSettingsFile

package SO;

public class NumberSettingsFile
{
    int numberSetting1 = 10;

    public int getNumberSetting1()
    {
        return numberSetting1;
    }

    public void setNumberSetting1(int newNumberSetting1)
    {
        numberSetting1 = newNumberSetting1;
    }
}

我的菜单栏

package SO;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class MyMenuBar extends JMenuBar
{
    ArrayList<Integer> list = new ArrayList<Integer>();
    NumberSettingsFile uniSet = new NumberSettingsFile();
    JComboBox sortComboBox;
    MyGUI mG;

    public MyMenuBar(MyGUI mG)
    {
        this.mG = mG;
        setBorderPainted(true);
        makeMenuBar();
    }

    public void makeMenuBar()
    {       
        countTo(20);
        sortComboBox = new JComboBox(list.toArray());
        sortComboBox.setMaximumSize(new Dimension(100,25));
        sortComboBox.addItemListener(new sortComboBoxChanged());
        add(sortComboBox);
        sortComboBox.setSelectedItem(uniSet.getNumberSetting1());
    }

    public void countTo(int C)
    {
        for(int k =2; k<=C; k++)
        {
            list.add(k);
        }
    }

    class sortComboBoxChanged implements ItemListener
    {
        @Override
        public void itemStateChanged(ItemEvent e)
        {
            String s = sortComboBox.getSelectedItem()+"";
            uniSet.setNumberSetting1(Integer.parseInt(s));
            System.out.println("This is the number which should be shown if you click the button: "+uniSet.getNumberSetting1());
        }
    }
}

MyGUI

package SO;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyGUI
{
    JFrame exampleFrame = new JFrame("Example");
    JPanel examplePanel = new JPanel();
    JButton exButton = new JButton();

    NumberSettingsFile uniSet = new NumberSettingsFile();
    MyMenuBar mbr;

    public void runGUI()
    {
        exampleFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        exampleFrame.setBounds(10,10,250,180);

        exampleFrame.setLayout(new GridLayout(1,1));

        createExamplePanel();

        mbr = new MyMenuBar(this);

        exampleFrame.setJMenuBar(mbr);

        exampleFrame.getContentPane().add(examplePanel);

        exampleFrame.setVisible(true);
    }

    public void createExamplePanel()
    {
        examplePanel.setLayout(null);

        exButton.setBounds(10,10,100,100);
        exButton.setText("<html><CENTER>Press Me</CENTER></html>");
        exButton.addActionListener(new CustomActionListener());
        examplePanel.add(exButton);
    }

    public static void main(String[] args)
    {
        MyGUI mG = new MyGUI();
        mG.runGUI();
    }

    class CustomActionListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if(e.getSource() == exButton)
            {
                System.out.println("This is the number which is shown if you click the button: "+uniSet.getNumberSetting1());
            }
        }
    }
}

RunSO.java

import SO.*;

public class RunSO
{   
    public static void main(String[] args)
    {
        RunSO rS = new RunSO();
        MyGUI.main(args);
    }
}

对于此事,我将不胜感激。

您想在两个对象之间共享 NumberSettingsFile 的一个实例。为此,您应该避免在 类 内创建它,而是在创建两个 类 的地方创建它,并将共享实例传递给它们。

在这种情况下,您的 类 之一已经是创建另一个实例的那个。所以你应该传递 NumberSettingsFile:

的实例

MyMenuBar 中,而不是创建实例:

NumberSettingsFile uniSet = new NumberSettingsFile();

只声明不初始化:

NumberSettingsFile uniSet;

然后更改构造函数:

public MyMenuBar(MyGUI mG, NumberSettingsFile uniSet)
{
    this.mG = mG;
    this.uniSet = uniSet;
    setBorderPainted(true);
    makeMenuBar();
}

然后,在MyGui中更改菜单栏的创建:

mbr = new MyMenuBar(this, uniSet);

现在 GUI 和菜单栏之间只共享一个实例。

在创建它们时,不是创建多个实例,而是将一个实例传递给两个 类?或者那行不通。

   BaseClass has new NumberSettingFileInstance nsfi
      |                    |
new MyMenuBar(nsfi)     new MyGUI(nsfi)

我希望我粗略的 ASCII 艺术图能说明一些问题。