[英]How do I pass information between two JFrames?
我有一個 JFrame 游戲作為學校項目,帶有一個按鈕,它會導致第二個 JFrame,即設置框架。 我現在希望我的設置應用於我的主 JFrame。 我該怎么做呢?
主 JFrame:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.math.*;
import java.util.Random;
import java.awt.geom.*;
import javax.swing.border.*;
import javax.swing.tree.*;
import java.io.*;
import javax.sound.sampled.*;
import javax.sound.*;
public class SpiceWars4 extends JFrame {
// Anfang Attribute
private JList jList1 = new JList();
private DefaultListModel jList1Model = new DefaultListModel();
private JScrollPane jList1ScrollPane = new JScrollPane(jList1);
private JList jList2 = new JList();
private DefaultListModel jList2Model = new DefaultListModel();
private JScrollPane jList2ScrollPane = new JScrollPane(jList2);
private JList jList3 = new JList();
private DefaultListModel jList3Model = new DefaultListModel();
private JScrollPane jList3ScrollPane = new JScrollPane(jList3);
private JLabel lSchwarzmarkt = new JLabel();
private JLabel lLaderaum = new JLabel();
private JButton bKaufen = new JButton();
private JButton bVerkaufen = new JButton();
private JNumberField jNumberField1 = new JNumberField();
private JButton bWeiterreisen = new JButton();
public int radius;
private JButton jButton1 = new JButton();
private JButton jtest = new JButton();
// Ende Attribute
int [] KostenMin = new int [5];
int [] KostenMax = new int [5];
//**Grunddinger Anfang
int Geld, Laderaum;
String [] Gewürze = new String [5];
int [] aktKosten = new int [5];
int [] EigeneLadung = new int [5];
Random rand = new Random();
//**Grunddinger Ende
public SpiceWars4() {
// Frame-Initialisierung
super();
//String filepath = "song.wav"; //wählt song aus
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 865;
int frameHeight = 698;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("SpiceWars");
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
cp.setBackground(new Color(0x666666));
// Anfang Komponenten
jList1.setModel(jList1Model);
jList1ScrollPane.setBounds(24, 48, 302, 228);
jList1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
jList1_MouseClicked(evt);
}
});
jList1.setBackground(new Color(0x646464));
cp.add(jList1ScrollPane);
jList2.setModel(jList2Model);
jList2ScrollPane.setBounds(504, 48, 278, 260);
jList2.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
jList2_MouseClicked(evt);
}
});
jList2.setBackground(new Color(0x646464));
cp.add(jList2ScrollPane);
jList3.setModel(jList3Model);
jList3ScrollPane.setBounds(24, 296, 142, 220);
jList3.setBackground(new Color(0x646464));
cp.add(jList3ScrollPane);
lSchwarzmarkt.setBounds(104, 8, 91, 28);
lSchwarzmarkt.setText("Markt ");
lSchwarzmarkt.setForeground(Color.WHITE);
cp.add(lSchwarzmarkt);
lLaderaum.setBounds(614, 8, 62, 28);
lLaderaum.setText("Laderaum ");
lLaderaum.setForeground(Color.WHITE);
cp.add(lLaderaum);
bKaufen.setBounds(368, 88, 83, 33);
bKaufen.setText(">>Kaufen ");
bKaufen.setMargin(new Insets(2, 2, 2, 2));
bKaufen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bKaufen_ActionPerformed(evt);
}
});
bKaufen.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
bKaufen_KeyPressed(evt);
}
});
bKaufen.setBackground(new Color(0x4F9B9B));
cp.add(bKaufen);
bVerkaufen.setBounds(368, 136, 83, 33);
bVerkaufen.setText("<<Verkaufen ");
bVerkaufen.setMargin(new Insets(2, 2, 2, 2));
bVerkaufen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bVerkaufen_ActionPerformed(evt);
}
});
bVerkaufen.setBackground(new Color(0x4F9B9B));
cp.add(bVerkaufen);
jNumberField1.setBounds(368, 48, 83, 28);
jNumberField1.setText("");
jNumberField1.setBackground(Color.GRAY);
cp.add(jNumberField1);
bWeiterreisen.setBounds(126, 570, 83, 33);
bWeiterreisen.setText("Weiterreisen");
bWeiterreisen.setMargin(new Insets(2, 2, 2, 2));
bWeiterreisen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bWeiterreisen(evt);
}
});
bWeiterreisen.setBackground(new Color(0x008080));
cp.add(bWeiterreisen);
bWeiterreisen.setBounds(96, 568, 136, 33);
bWeiterreisen.setBounds(32, 536, 136, 33);
jButton1.setBounds(712, 600, 112, 24);
jButton1.setText("Einstellungen");
jButton1.setMargin(new Insets(2, 2, 2, 2));
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1_ActionPerformed(evt);
}
});
cp.add(jButton1);
jtest.setBounds(736, 536, 80, 24);
jtest.setText("Button");
jtest.setMargin(new Insets(2, 2, 2, 2));
jtest.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jtest_ActionPerformed(evt);
}
});
cp.add(jtest);
// Ende Komponenten
//**Eigene Variabelen Anfang
Geld = 10000;
Laderaum = 1000 ;
Gewürze[0] = "Pfeffer";
Gewürze[1] = "Muskat";
Gewürze[2] = "Curry";
Gewürze[3] = "Vanille";
Gewürze[4] = "Zimt";
aktKosten[0] = 1500;
aktKosten[1] = 5000;
aktKosten[2] = 900;
aktKosten[3] = 1400;
aktKosten[4] = 650;
EigeneLadung[0] = 0;
EigeneLadung[1] = 0;
EigeneLadung[2] = 0;
EigeneLadung[3] = 0;
EigeneLadung[4] = 0;
//**Eigene Variablen Ende
//**Preisrandomisen Weiterreisen Anfang
KostenMin[0] = 1300;
KostenMin[1] = 4250;
KostenMin[2] = 725;
KostenMin[3] = 1125;
KostenMin[4] = 400;
KostenMax[0] = 1700;
KostenMax[1] = 6250;
KostenMax[2] = 1150;
KostenMax[3] = 1625;
KostenMax[4] = 800;
//**Preisrandomisen Weiterreisen Ende
Datenanzeigen();
setVisible(true);
} // end of public SpiceWars4
// Anfang Methoden
public static void main(String[] args) {
new SpiceWars4();
} // end of main
//**Kaufenbutton Anfang
public void bKaufen_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
int Anzahl = Integer.parseInt(jNumberField1.getText());
int Nummer = jList1.getSelectedIndex();
if (Anzahl*aktKosten[Nummer] <= Geld) {
Geld = Geld - Anzahl * aktKosten[Nummer];
EigeneLadung[Nummer] = EigeneLadung[Nummer] + Anzahl;
} // end of if
Datenanzeigen();
} // end of bKaufen_ActionPerformed
//**Kaufenbutton Ende
//**Vekaufsbutton Anfang
public void bVerkaufen_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
int Anzahl = Integer.parseInt(jNumberField1.getText());
int Nummer = jList2.getSelectedIndex();
if (Anzahl <= EigeneLadung [Nummer]) {
Geld = Geld + Anzahl * aktKosten[Nummer];
EigeneLadung[Nummer] = EigeneLadung[Nummer]-Anzahl;
} // end of if
Datenanzeigen();
} // end of bVerkaufen_ActionPerformed
//**Vekaufsbutton Ende
public void Datenanzeigen(){
jList1Model.removeAllElements();
jList2Model.removeAllElements();
jList3Model.removeAllElements();
for (int i = 0; i < 5; i++) {
jList1Model.addElement(Gewürze[i] + " kostet: " + aktKosten[i] + " Münzen ");
}
for (int i = 0; i < 5; i++) {
jList2Model.addElement(Gewürze[i] + " geladen: " + EigeneLadung[i] + " Stück ");
}
jList2Model.addElement("----------") ;
jList2Model.addElement("Geld: " + Geld);
jList3Model.addElement("Mendig");
jList3Model.addElement("Mayen");
jList3Model.addElement("Kruft");
jList3Model.addElement("Thür");
jList3Model.addElement("Bell");
}
public void jList1_MouseClicked(MouseEvent evt) {
// TODO hier Quelltext einfügen
int Index = jList1.getSelectedIndex();
jNumberField1.setText(Integer.toString((Geld / aktKosten[Index])));
} // end of jList1_MouseClicked
public void jList2_MouseClicked(MouseEvent evt) {
// TODO hier Quelltext einfügen
int Index = jList1.getSelectedIndex();
jNumberField1.setText(Integer.toString(EigeneLadung[Index]));
} // end of jList2_MouseClicked
//**weiterreisen von Welt zu Welt Anfang
public void bWeiterreisen(ActionEvent evt) {
// TODO hier Quelltext einfügen
for (int i = 0; i < 5; i++) {
aktKosten[i] = KostenMin[i] + rand.nextInt(KostenMax[i] - KostenMin[i]);
}
Datenanzeigen();
} // end of bWeiterreisen_ActionPerformed
//**Weiterreisen von Welt zu Welt Ende
public void bKaufen_KeyPressed(KeyEvent evt) {
// TODO hier Quelltext einfügen
} // end of bKaufen_KeyPressed
public void jButton1_ActionPerformed(ActionEvent evt) {
JFrame2 jf2 = new JFrame2(); //initalisierung neues jframe
jf2.setVisible(true);
dispose(); //Schließt das game
} // end of jButton1_ActionPerformed
public void jtest_ActionPerformed(ActionEvent evt) {
} // end of jtest_ActionPerformed
// Ende Methoden
} // end of class Spielprogrammieren
設置 JFrame:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.math.*;
import java.util.Random;
import java.awt.geom.*;
import javax.swing.border.*;
import javax.swing.tree.*;
import java.io.*;
import javax.sound.sampled.*;
import javax.sound.*;
public class JFrame2 extends JFrame {
// Anfang Attribute
private JButton jButton1 = new JButton();
private JScrollPane jScrollPane1 = new JScrollPane();
private JButton jmute = new JButton();
private JLabel jLabel1 = new JLabel();
private JButton bDarkMode1 = new JButton();
private JButton bLightMode1 = new JButton();
private JPanel jDifficulty = new JPanel();
private JScrollPane jScrollPane2 = new JScrollPane();
private ButtonGroup jDifficultyBG = new ButtonGroup();
private TitledBorder jDifficultyTB = new TitledBorder("Schwierigkeit");
private JRadioButton jDifficultyRB0 = new JRadioButton("Schwer");
private JRadioButton jDifficultyRB1 = new JRadioButton("Mittel");
private JRadioButton jDifficultyRB2 = new JRadioButton("Leicht");
// Ende Attribute
public JFrame2() {
// Frame-Initialisierung
super();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 373;
int frameHeight = 517;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("Einstellungen");
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
cp.setBackground(new Color(0x666666));
// Anfang Komponenten
jButton1.setBounds(104, 440, 160, 24);
jButton1.setText("Zurück");
jButton1.setMargin(new Insets(2, 2, 2, 2));
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1_ActionPerformed(evt);
}
});
jButton1.setBackground(new Color(0x49969E));
cp.add(jButton1);
jScrollPane1.setBounds(696, -16, 1, 17);
cp.add(jScrollPane1);
jmute.setBounds(120, 160, 128, 24);
jmute.setText("Musik aus");
jmute.setMargin(new Insets(2, 2, 2, 2));
jmute.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jmute_ActionPerformed(evt);
}
});
jmute.setBackground(new Color(0x49969E));
jmute.setRolloverEnabled(false);
cp.add(jmute);
jLabel1.setBounds(112, 24, 328, 47);
jLabel1.setText("Einstellungen");
jLabel1.setFont(new Font("Dialog", Font.BOLD, 24));
cp.add(jLabel1);
bDarkMode1.setBounds(144, 216, 80, 24);
bDarkMode1.setText("Dark Mode");
bDarkMode1.setMargin(new Insets(2, 2, 2, 2));
bDarkMode1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bDarkMode1_ActionPerformed(evt);
}
});
bDarkMode1.setBackground(Color.BLACK);
bDarkMode1.setForeground(Color.WHITE);
cp.add(bDarkMode1);
bLightMode1.setBounds(144, 272, 80, 24);
bLightMode1.setText("Light Mode");
bLightMode1.setMargin(new Insets(2, 2, 2, 2));
bLightMode1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
bLightMode1_ActionPerformed(evt);
}
});
bLightMode1.setBackground(Color.WHITE);
bLightMode1.setForeground(new Color(0x060606));
cp.add(bLightMode1);
jDifficulty.setLayout(null);
jDifficulty.setBounds(128, 336, 120, 80);
jDifficulty.setBackground(new Color(0x666666));
jDifficulty.setForeground(new Color(0x666666));
jDifficultyRB0.setBounds(7, 18, 106, 20);
jDifficultyRB0.setSelected(true);
jDifficultyBG.add(jDifficultyRB0);
jDifficulty.add(jDifficultyRB0);
jDifficultyRB1.setBounds(7, 37, 106, 19);
jDifficultyBG.add(jDifficultyRB1);
jDifficulty.add(jDifficultyRB1);
jDifficultyRB2.setBounds(7, 56, 106, 19);
jDifficultyBG.add(jDifficultyRB2);
jDifficulty.add(jDifficultyRB2);
jDifficulty.setBorder(jDifficultyTB);
cp.add(jDifficulty);
jScrollPane2.setBounds(352, -16, 1, 17);
cp.add(jScrollPane2);
// Ende Komponenten
setVisible(true);
} // end of public JFrame2
// Anfang Methoden
public static void main(String[] args) {
new JFrame2();
} // end of main
public void jButton1_ActionPerformed(ActionEvent evt) {
SpiceWars4 jf1 = new SpiceWars4(); //initalisierung neues jframe
jf1.setVisible(true);
dispose(); //Schließt die Einstellungen
} // end of jButton1_ActionPerformed
public void jmute_ActionPerformed(ActionEvent evt) {
} // end of jmute_ActionPerformed
public void bDarkMode1_ActionPerformed(ActionEvent evt) {
Container cp = getContentPane();
if (evt.getSource()==bDarkMode1) {
jButton1.setBackground(new Color(0x49969E));
jButton1.setForeground(new Color(0x333333));
cp.setBackground(new Color(0x666666));
jmute.setBackground(new Color(0x49969E));
jDifficulty.setBackground(new Color(0x666666));
jDifficulty.setForeground(new Color(0x666666));
} // end of if
} // end of bDarkMode1_ActionPerformed
public void bLightMode1_ActionPerformed(ActionEvent evt) {
Container cp = getContentPane();
if (evt.getSource()==bLightMode1) {
jButton1.setBackground(Color.WHITE);
jButton1.setForeground(new Color(0x666666));
jDifficulty.setBackground(Color.WHITE);
jmute.setBackground(Color.WHITE);
cp.setBackground(Color.WHITE);
} // end of if
} // end of bLightMode1_ActionPerformed
public String jDifficultyBG_getSelectedButtonGroupLabel() {
for (java.util.Enumeration<AbstractButton> e = jDifficultyBG.getElements(); e.hasMoreElements();) {
AbstractButton b = e.nextElement();
if (b.isSelected()) return b.getText();
}
return "";
}
// Ende Methoden
} // end of class JFrame2
例如,當用戶單擊 LightMode 按鈕時,它也應該應用於主 Jframe,與 DarkMode 按鈕相同。
感謝您的幫助,因為我還是個初學者。
聽起來您想要觀察者模式,當某處發生事件時您希望您的第一個 JFrame 對其做出反應。
此解決方案需要 Java 7 或更高版本
讓一個單獨的類維護您的設置狀態是有意義的。 這個實現是一個單例,它對你的實現來說已經足夠好了,盡管隨着你的學習會有更好的選擇。
public class Settings {
public enum ScreenMode {
LIGHT,
DARK
}
private static Settings settings;
private ScreenMode screenMode = ScreenMode.LIGHT;
private final PropertyChangeSupport pcs;
/**
* Private constructor to force singleton pattern
*/
private Settings() {
pcs = new PropertyChangeSupport(this);
}
/**
* Get the singleton instance of Settings.
* When you learn dependency injection, prefer that.
*/
public static Settings getSettings() {
if (settings == null) {
settings = new Settings();
}
return settings;
}
public void addPropertyChangeListener(PropertyChangeListener pcl) {
pcs.addPropertyChangeListener(pcl);
}
public void setScreenMode(ScreenMode mode) {
pcs.firePropertyChange("screen_mode", this.screenMode, mode);
this.screenMode = mode;
}
}
此設置對象將允許任何PropertyChangeListener
訂閱它並在屬性更改時收到通知。 JFrame 1 可以通過實現接口並訂閱Settings.addPropertyChangeListener()
方法成為PropertyChangeListener
。
public class SpiceWars4 extends JFrame implements PropertyChangeListener {
public SpiceWars4() {
// Frame-Initialisierung
super();
Settings.getSettings().addPropertyChangeListener(this); // Subscribe
...
}
...
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("screen_mode")) {
Settings.ScreenMode mode = (Settings.ScreenMode) evt.getNewValue();
switch (mode) {
case LIGHT:
// Called when screen mode is changed from dark to light
break;
case DARK:
// Called when screen mode is changed from light to dark
break;
}
}
}
...
}
然后是 JFrame 2 中的代碼,它在您單擊按鈕時實際設置屬性:
Settings.getSettings().setScreenMode(Settings.ScreenMode.DARK);
設置屏幕模式會觸發屬性更改事件,該事件將執行所有訂閱者 (JFrame 1) 的propertyChange(PropertyEvent)
方法。 然后可以根據需要處理或忽略該事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.