C
Carola
Gast
Hallo,
Ich muß meine Frage zu Swing nochmal etwas deutlicher stellen. Deswegen habe ich jetzt hier auch den kompletten Quelltext reingestellt.
Also: Ich hab mir nach langem Lesen eine Art Vorlage gebastelt, die ich öfters mal in ein paar Programmen verwenden will. Es ist eine Hauptklasse (SwingTemplate) die verschiedene Knöpfe hat, später vielleicht auch mal eine Menu-Bar.
Zur Zeit kann man mit den Knöpfen "Option" und "About" zwei Fenster öffnen. (Dies kommt später in die Menubar unter "Options" und "About".)
Das klappt auch soweit.
Der Code ist natürlich noch nicht ausgereift, es ist alles nur zu Testzwecken. Alle Buttons sind schief und krumm,
daran bitte nicht stören. Auch die Bezeichnungen sind nur ganz knapp und kurz gewählt.
Meine Fragen:
1) Ist das so wie ich es mit den Fenstern mache und der allgemeine Entwurf mit den Abfragen, der Knöpfe so "richtig" ? Stimmen auch die Aufrufe der Fenster ? Macht man das wirklcih so ?
2) Ich verstehe noch nicht ganz warum ich in der Klasse OptionWindows, beim Öffen des OptionWindows mit einem zweiten "this", die ganze Hauptklasse (SwingTemplate) mit übergeben muß. Bzw. ich verstehe es, wenn es richtig wäre, daß ich dann aus der Klasse OptionWindow Membervariablen von SwingTemplate verändern darf. Denn irgendwoher muß die SwingTemplate Klasse ja mitbekommen, wenn ich im OptionWindow Häckchen setze.
Wenn ich das weiter richtig verstehen, dann greife ich nicht direkt auf die Variablen von SwingTemplate zu, sondern verwende eine SETTER-Methode. Aber das muß ich natürlich dann in OptionWindows aufrufen, oder
Also konkret: s.seteineVariable("Neuer Text"); Doch leider klappt das so nicht. s.eineVariable = "NeuerText" klappt dagegen.
3) Wichtig Frage: Was mach ich wenn, ich ein Textfeld in der OptionWindows Klasse haben möchte.
Wenn ich das in OptionWindows definiere, wie kann ich dann die Eingabe zurückliefern ?
Oder definiere ich das Textfeld mit Namen textfeld in Swingtemplate und greife über s.textfeld aus der OptionWindowsklasse drauf zu ?
WICHTIG: Ihr braucht den Layoutmanager PAGELAYOUT falls ihr den Code ausführen wollt.
Ich muß meine Frage zu Swing nochmal etwas deutlicher stellen. Deswegen habe ich jetzt hier auch den kompletten Quelltext reingestellt.
Also: Ich hab mir nach langem Lesen eine Art Vorlage gebastelt, die ich öfters mal in ein paar Programmen verwenden will. Es ist eine Hauptklasse (SwingTemplate) die verschiedene Knöpfe hat, später vielleicht auch mal eine Menu-Bar.
Zur Zeit kann man mit den Knöpfen "Option" und "About" zwei Fenster öffnen. (Dies kommt später in die Menubar unter "Options" und "About".)
Das klappt auch soweit.
Der Code ist natürlich noch nicht ausgereift, es ist alles nur zu Testzwecken. Alle Buttons sind schief und krumm,
daran bitte nicht stören. Auch die Bezeichnungen sind nur ganz knapp und kurz gewählt.
Meine Fragen:
1) Ist das so wie ich es mit den Fenstern mache und der allgemeine Entwurf mit den Abfragen, der Knöpfe so "richtig" ? Stimmen auch die Aufrufe der Fenster ? Macht man das wirklcih so ?
2) Ich verstehe noch nicht ganz warum ich in der Klasse OptionWindows, beim Öffen des OptionWindows mit einem zweiten "this", die ganze Hauptklasse (SwingTemplate) mit übergeben muß. Bzw. ich verstehe es, wenn es richtig wäre, daß ich dann aus der Klasse OptionWindow Membervariablen von SwingTemplate verändern darf. Denn irgendwoher muß die SwingTemplate Klasse ja mitbekommen, wenn ich im OptionWindow Häckchen setze.
Wenn ich das weiter richtig verstehen, dann greife ich nicht direkt auf die Variablen von SwingTemplate zu, sondern verwende eine SETTER-Methode. Aber das muß ich natürlich dann in OptionWindows aufrufen, oder
Also konkret: s.seteineVariable("Neuer Text"); Doch leider klappt das so nicht. s.eineVariable = "NeuerText" klappt dagegen.
3) Wichtig Frage: Was mach ich wenn, ich ein Textfeld in der OptionWindows Klasse haben möchte.
Wenn ich das in OptionWindows definiere, wie kann ich dann die Eingabe zurückliefern ?
Oder definiere ich das Textfeld mit Namen textfeld in Swingtemplate und greife über s.textfeld aus der OptionWindowsklasse drauf zu ?
WICHTIG: Ihr braucht den Layoutmanager PAGELAYOUT falls ihr den Code ausführen wollt.
Code:
package de.proton.SwingTemplate;
import static pagelayout.EasyCell.center;
import static pagelayout.EasyCell.column;
import static pagelayout.EasyCell.hgap;
import static pagelayout.EasyCell.row;
import java.awt.Checkbox;
import java.awt.Color;
import java.awt.Container;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import pagelayout.Column;
public class SwingTemplate extends JFrame implements ActionListener
{
List listenfeld = new List(10, true);
JButton p = new JButton("Knopf P");
JButton s = new JButton("Knopf S");
JButton options = new JButton("Options");
JButton about = new JButton("About");
String eineVariable="noch leer";
public SwingTemplate()
{
Container gcp = this.getContentPane();
Column topLevel = column(listenfeld, row(center, center, p,s),
row(center, center, options,about));
topLevel.createLayout(gcp);
options.addActionListener(this);
about.addActionListener(this);
}
// Set-Methode für eineVariable
public void seteineVariable(String s)
{
eineVariable = s;
}
private static void createAndShowGUI()
{
JFrame frame = new SwingTemplate();
UIManager.put("swing.boldMetal", Boolean.FALSE);
frame.setSize(1024, 700);
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
// *** geforderte Methoden wegen "implements ActionListener"
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (source == this.options)
{
new OptionWindow(this, this);
}
if (source == this.about)
{
new AboutWindow(this);
}
}
}
package de.proton.SwingTemplate;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
public class OptionWindow extends JDialog implements ActionListener
{
private SwingTemplate s;
private int state = 2;
JCheckBox c1;
JCheckBox c2;
JCheckBox c3;
JCheckBox c4;
JCheckBox c5;
JCheckBox c6;
JTextField t6;
JButton ok = new JButton("OK");
OptionWindow(JFrame owner, SwingTemplate s)
{
super(owner, true);
this.s = s;
this.setTitle("Options");
this.setSize(400, 400);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// this.setBounds(200,200,400,300);
ok.addActionListener(this);
JPanel toppanel = new JPanel();
toppanel.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
JPanel p4 = new JPanel();
p1.setBackground(Color.LIGHT_GRAY);
p2.setBackground(Color.LIGHT_GRAY);
p3.setBackground(Color.LIGHT_GRAY);
p4.setBackground(Color.LIGHT_GRAY);
p1.setLayout(new GridLayout(6, 1));
p2.setLayout(new GridLayout(1, 3));
p3.setLayout(new GridLayout(1, 3));
p4.setLayout(new GridLayout(1, 3));
c1 = new JCheckBox("Beim Beenden Programm ohne Abfrage verlassen");
c2 = new JCheckBox("Andere Einstellung setzen");
c3 = new JCheckBox("Herunterfahren nach Messung");
c4 = new JCheckBox("Noch eine Einstellung");
c5 = new JCheckBox("Mehr Einstellungen");
t6 = new JTextField("Eingabe:");
p1.add(c1);
p1.add(c2);
p1.add(c3);
p1.add(c4);
p1.add(c5);
p1.add(t6);
JTabbedPane tbp = new JTabbedPane();
tbp.setPreferredSize(new Dimension(300, 300));
tbp.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
tbp.addTab("Allgemein", p1);
tbp.addTab("Messung", p2);
tbp.addTab("Sonstiges", p3);
tbp.addTab("R4", p4);
toppanel.add(tbp, BorderLayout.NORTH);
toppanel.add(ok, BorderLayout.SOUTH);
this.add(toppanel);
this.setVisible(true);
}
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (source == this.c1)
{
s.eineVariable ="C1 betätigt";
}
if (source == this.ok)
{
this.dispose();
}
}
}
package de.proton.SwingTemplate;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class AboutWindow extends JDialog implements ActionListener
{
JButton ok = new JButton("OK");
AboutWindow(JFrame owner)
{
super(owner, true);
this.setSize(200, 200);
this.setLocation(300, 300);
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
ok.addActionListener(this);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(5, 1));
p1.setBackground(Color.GREEN);
JLabel l1 = new JLabel("Beschriftung");
JLabel l2 = new JLabel("Beschriftung");
JLabel l3 = new JLabel("Beschriftung");
JLabel l4 = new JLabel("Beschriftung");
p1.add(l1);
p1.add(l2);
p1.add(l3);
p1.add(l4);
p1.add(ok);
this.add(p1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == this.ok)
{
this.dispose();
}
}
}