Java 中的实例
Instances in Java
我有4个类; RunSO
、MyGUI
、MyMenuBar
和 NumberSettingsFile
。我在 MyGUI
和 MyMenuBar
中有一个 NumberSettingsFile
的实例。问题是它们是单独的实例,所以当我在一个实例中使用方法时,它不会更新第二个实例中的值。我的问题是如何让这些实例协同工作。例如,如果我将 sortComboBox
的值设置为 11
。它更新 MyMenuBar
中 NumberSettingsFile
的实例,但不更新 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 艺术图能说明一些问题。
我有4个类; RunSO
、MyGUI
、MyMenuBar
和 NumberSettingsFile
。我在 MyGUI
和 MyMenuBar
中有一个 NumberSettingsFile
的实例。问题是它们是单独的实例,所以当我在一个实例中使用方法时,它不会更新第二个实例中的值。我的问题是如何让这些实例协同工作。例如,如果我将 sortComboBox
的值设置为 11
。它更新 MyMenuBar
中 NumberSettingsFile
的实例,但不更新 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 艺术图能说明一些问题。