![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hallo, ich habe wieder ein Problem mit dem Wechseln eines jPanel. ausgangszustand: ein jPanel wird angezeigt, der User tätigt Eingabe in ein jTextField und bestätigt seine Eingabe mittels jButton. Nach bestätigen wird die Eingabe des Users auf Richtigkeit geprüft und abhängig davon ob die Antwort richtig oder falsch ist wird ein Dialog angezeigt. Angenommen der User hat die richtige Antwort gegeben: ein Dialog "Ihre Antwort ist richtig!" erscheint. Der User bestätigt den Dialog mit einem jButton "weiter" --> hier soll jetzt ein neues jPanel angezeigt werden --> dies funktioniert aber aus irgendwelchen Gründen nicht. Es wird keine Fehlermeldung angezeigt, es wird nur das jPanel nicht gewechselt. Kann mir bitte jemand weiter helfen! Ich habe jetzt schon Tage lang rum probiert, aber es funktioniert nicht. Vielleicht sehe ich den Fehler nicht, oder es kann nicht funktionieren so wie ich das mache. Ich habe folgende Klassen: Klasse Haupt: quasi meine Hauptklasse Klasse Kapitel: hier prüfe ich die Eingabe des Users auf Richtigkeit und rufe dann die Klasse RightDialog auf. Klasse RightDialog: verantwortlich für zeigen des Dialoges Auszug aus der Klasse Kapitel: (jButton5 ist der Button für die Bestätigung der gegebenen Antwort) Code: jButton5.addMouseListener(new java.awt.event.MouseListener() {
public void mousePressed(java.awt.event.MouseEvent e) {
eingabe = jEditorPane1.getText();
if (eingabe.equals("5")) {
RightDialog rdi = new RightDialog(wert);
rdi.setVisible(true);
}
else {
FalseDialog fdial = new FalseDialog();
fdial.setVisible(true);
}
}
Code: public class RightDialog extends JDialog {
private static final long serialVersionUID = -4159846805776933650L;
JButton jButton10 = new JButton();
private boolean weiter = false;
private int dwert;
public RightDialog(int wert) {
super();
this.setModal(true);
this.setBounds(250,240,300,120);
dwert = wert;
JPanel jPanel2 = new JPanel();
jPanel2.setLayout(null);
jPanel2.setBackground(new java.awt.Color(208, 207, 207));
JLabel label = new JLabel();
label.setText("Ihre Antwort ist richtig!");
label.setBounds(67,15,165,22);
label.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 12));
label.setForeground(new java.awt.Color(0,115,86));
jButton10.setText("weiter");
jButton10.setBounds(110,45,80,26);
jButton10.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 12));
jButton10.addActionListener(rightDialog);
jPanel2.add(jButton10);
jPanel2.add(label);
add(jPanel2);
}
ActionListener rightDialog = new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(event.getSource() == jButton10) {
Haupt haupt = new Haupt(dwert);
weiter = true;
dispose();
}
}
};
}
Auszug aus der Klasse Haupt. Code: int flag = 2;
public Haupt() {
super();
initialize();
this.content = this.getContentPane();
updateStart(jPanelStart());
}
public Haupt(int dwert) {
this.content = this.getContentPane();
flag = dwert + 1;
setFlag(flag);
updateDialog(dwert);
}
private void initialize() {
this.setBounds(0, 0, 800, 600);
this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
this.setTitle("Test");
this.setBackground(Color.yellow);
}
private void updateStart(JPanel panel) {
content.setLayout(null);
content.add(panel);
warten();
}
public void updateGui(JPanel panel, JPanel navigationsleiste) {
content.removeAll();
content.setLayout(null);
content.add(getLogo());
content.add(panel);
content.add(navigationsleiste);
content.repaint();
}
private void warten() {
timer = new Timer( 1000, new ActionListener() {
public void actionPerformed( ActionEvent e ) {
kap = new Kapitel1();
updateGui(kap.jp(flag), getNavigationsleiste());
timer.stop();
}
});
timer.start();
}
public void updateDialog(int wert) {
System.out.println("in updateDialog");
if(wert >=1 && wert <=81) {
kap = new Kapitel1();
if(wert!=3) {
System.out.println("in if flag != 3");
updateGui(kap.jp(wert), getNavigationsleiste2());
}
}
}
|
| | |
| | Nach oben #4 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Oh. Das könnte vielleicht daran liegen, dass du es nicht änderst. bzw. du erzeugst ein neues "Haupt"-Objekt und arbeitest dann damit weiter. Das kann so nichts werden. Du musst dem Dialog das ursprüngliche Haupt-Objekt übergeben, damit er das ändern kann. |
| | |
| | Nach oben #5 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hallo, das habe ich jetzt hingekriegt, dafür hat sich ein neues problem geöffnet: die unterschiedlichen jPanel stehen in der Klasse Kapitel. in der Klasse Haupt hole ich mir ein jPanel und zeige es an. die jPanel enthalten aber auch ein bzw. mehrere jTextField, in die der User eine Eingabe tätigt. Wie komme ich jetzt zur Eingabe des Users, wenn er den Button geklickt hat? Der ok button wird erst in der klasse haupt hinzugefügt und da ist auch der listener. |
| | |
| | Nach oben #6 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Dafür gibts mehrere Möglichkeiten. Ich würde folgende bevorzugen: Du erzeugst Unterklassen von JPanel, die getter-Methoden für die Textfelder haben. Dann kannst du von der Button-Methode auf diese Textfelder zugreifen und deren Inhalt verarbeiten. |
| | |
| | Nach oben #8 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
| Code: public class MyPanel extends JPanel {
private JTextField user;
public MyPanel() {
super();
user = new JTextField();
// add to this panel
}
public JTextField getUserField() {
return user;
}
}
Code: if(panel instanceof MyPanel) {
JTextField userField = ((MyPanel)panel).getUserField();
}
|
| | |
| | Nach oben #9 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hilf mir bitte mal auf die sprünge. ersetzt dies jetzt mein bisheriges jTextField? statt: Code: JTextField jEditorPane1 = new JTextField();
jEditorPane1.setBounds(new java.awt.Rectangle(493, 250, 50, 23));
jEditorPane1.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
jEditorPane1.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 1));
Code: MyPanel mp = new MyPanel(); jpanel.add(mp); |
| | |
| | Nach oben #10 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Du hast doch verschiedene JPanel, die Textfelder enthalten sollen, richtig? Jedes dieser JPanel behandelst du wie eine ganz normale Klasse. Du kannst der die Textfelder usw. zuweisen. Mit dem "// add to this panel" meinte ich sowas: Code: setLayout(new GridBagLayout());
EGBConstraints c = new EGBConstraints(); // forensuche benutzen
c.installHorizontalGap(this, "pref, 5, pref");
add(new JLabel("Username:"), c.xy(1,1));
add(user, c.xy(1,3));
Außerdem solltest du dich wirklich mit LayoutManagern befassen. Das Null-Layout ist absolut miserabel und fehleranfällig. |
| | |
| | Nach oben #11 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hallo, ja, ich verwende verschiedene jPanel die kein, - ein bzw. mehrere jTextField enthalten. diese jPanel hole ich mir über eine Methode aus der Klasse Kapitel. zB: Code:
public class Kapitel1 {
public JPanel jp(int var) {
final int flag = var;
jpan = new JPanel();
if(var == 8){
JLabel jLabel = new JLabel();
jLabel.setBounds(new java.awt.Rectangle(0, 15, 767, 38));
jLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 24));
jLabel.setText("Wiederholung - YYYY");
JPanel jPanel1 = new JPanel();
jPanel1.setLayout(null);
jPanel1.setBounds(new java.awt.Rectangle(15, -1, 767, 62));
jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(0, 0, 2, 0, java.awt.Color.black));
jPanel1.setBackground(new java.awt.Color(208, 207, 207));
jPanel1.add(jLabel, null);
JTextPane jTextPane = new JTextPane();
jTextPane.setBounds(new java.awt.Rectangle(30, 250, 453, 23));
jTextPane.setBackground(new java.awt.Color(208, 207, 207));
jTextPane.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
jTextPane.setDisabledTextColor(new java.awt.Color(51, 51, 51));
jTextPane.setEnabled(false);
jTextPane.setText("Über wieviele XXXX verfügt die YYYY? (Ergänzen Sie)");
JTextField jEditorPane1 = new JTextField();
jEditorPane1.setBounds(new java.awt.Rectangle(493, 250, 50, 23));
jEditorPane1.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
jEditorPane1.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 1));
jpan.setBackground(new java.awt.Color(208, 207, 207));
jpan.setLayout(null);
jpan.setEnabled(false);
jpan.add(jLabel);
jpan.add(jPanel1);
jpan.add(jTextPane);
jpan.add(jEditorPane1);
jpan.setLocation(new java.awt.Point(0,0));
jpan.setSize(new java.awt.Dimension(794,496));
}
return jpan;
}
Diesem jpan wird in der Klasse Haupt ein JButton hinzugefügt: Code: private JButton getJButtonOk() {
jButtonOk = new JButton();
jButtonOk.setLocation(new java.awt.Point(717, 86));
jButtonOk.setIcon(new ImageIcon(getClass().getResource("/logo_button/okverwendet.png")));
jButtonOk.setPreferredSize(new java.awt.Dimension(50, 45));
jButtonOk.setSize(new java.awt.Dimension(50, 45));
jButtonOk.addActionListener(dialogListener);
return jButtonOk;
}
Code: ActionListener dialogListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
UIManager.getLookAndFeelDefaults().put("Button.font", new Font("Verdana", Font.BOLD, 12));
UIManager.getLookAndFeelDefaults().put("Label.font", new Font("Verdana", Font.BOLD, 12));
UIManager.getLookAndFeelDefaults().put("OptionPane.background", new java.awt.Color(208, 207, 207));
UIManager.getLookAndFeelDefaults().put("Panel.background", new java.awt.Color(208, 207, 207));
if ( ?????? ) {
int a = JOptionPane.showOptionDialog(null,"Ihre Antwort ist richtig!",null,JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE,null,weiter,null);
if (a == 0) {
System.out.println("weiter gewählt");
flag = flag + 1;
updateGui(kap.jp(flag), getNavigationsleiste2()); }
else if (a == JOptionPane.CLOSED_OPTION)
System.out.println("User hat Fenster geschlossen!");
else
System.out.println("Unbekannter Fehler");
}
else {
int a = JOptionPane.showOptionDialog(null,"Ihre Antwort ist falsch!",null,JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null,option,null);
switch (a)
{
case 0: System.out.println("neuer Versuch gewählt");
break;
case 1: System.out.println("Antwort zeigen gewählt");
break;
case 2: System.out.println("Weiter gewählt");
break;
case JOptionPane.CLOSED_OPTION: System.out.println("User hat Fenster geschlossen!");
break;
default: System.out.println("Unbekannter Fehler");
}
}
}
};
ich füge später keine textfields mehr hinzu. ich will die eingabe haben, die in jEditorPane1 eingegeben wurde! ich habe ca. 100 Panels, hier kann ich keinen "gescheiten" layout-manager verwenden, da alles sehr, sehr unterschiedlich ist. Geändert von risa (17.04.2006 um 20:59 Uhr) |
| | |
| | Nach oben #12 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Oh je... dein Problem ist ganz eindeutig, dass du viel zu unsauber arbeitest - auf die API bezogen. Tu dir selbst den Gefallen und beschäftige dich mit demnächst mal mit "Design Patterns" (ich empfehle "Head First: Design Patterns") und API-Design im Allgemeinen. Sieh dir andere (gut geschriebene) Programme an und schau, wie die das machen. Sonst wirst du immer wieder solche Probleme haben, wirklich. Das bringts so nicht. Bzgl. Null-Layout: Du kannst auch jedem JPanel einen eigenen LayoutManager zuweisen. Und wenn dir der Layout-Kram zu kompliziert ist, dann verwende einfach NetBeans. Das hat nen sehr guten GUI-Builder, mit dem du gute Ergebnisse erzielen kannst und ist sehr leicht zu benutzen, wirklich. Das war jetzt gut gemeinte Kritik und ich hoffe, dass dir das ein bisschen weiter hilft. Es ist also wirklich nicht böse gemeint - falls das trotzdem so rüberkam. Hast du so'n bisschen Ahnung von UML? Dann könnte ich dir dazu mal ein Beispiel-Diagramm malen. In diesem Fall sieht es aber so aus, als ob es möglich wäre, dem Kapitel1 das JTextField als Attribut zuzuweisen und dann darüber darauf zuzugreifen. Das wäre jedenfalls die in diesem Falle einfachste Lösung... |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Grösse des JFrames and JPanel anpassen | alekz | Desktop-Applikationen und Grafik | 1 | 15.05.2006 14:52 |
| jPanel nach verzögerung wechseln | risa | Desktop-Applikationen und Grafik | 2 | 15.04.2006 13:17 |
| JPanel | am82 | Desktop-Applikationen und Grafik | 6 | 02.12.2005 17:02 |
| JPanel in JFrame ersetzen | muge | Desktop-Applikationen und Grafik | 2 | 24.11.2005 22:18 |
| JTabbedPanel & JPanel - Probleme mit dem Layout | Tactive | Desktop-Applikationen und Grafik | 8 | 24.02.2005 15:27 |