Layout Probleme (Kein Adden möglich)

  • Themenstarter Themenstarter Slider
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Slider

Gast
Hallo, habe gerade ein dringendes Problem.

Ich schreibe ein Tagebuch, bei dem immer wenn auf "speichern" geklickt wird, eine Methode aufgerufen wird, bei der der Eintrag in einem JTabbedPane Fenster angeziegt wird.

Wenn nun 3 einträge geschrieben werden, sollen logischer Weise 3 Einträge unter einander stehen.
Ich dachte mir ich mache für jeden eintrag ein Panel, und immer wenn man speichert, wird das panel dem GridbagLayout zugewiesen.

Problem 1: ich kann innerhalb meiner If Anweisung nicht adden.

Code:
public void showPanel(int count){
		writePanel.setLayout(new GridLayout(5,1));
		if(eintragListe.size() > 0){
			DiaryEintrag ein = eintragListe.get(count);
			System.out.println("Datum: "+ein.getDatum()+"\nTitel: "+ein.getTitel()+"\nNummer: "+eintragListe.size()+"\nText: "+ein.getText()+"\n");
			
			

			writePanel.add(new JButton("3"));
		}
		writePanel.add(new JButton("1"));
		writePanel.add(new JButton("2"));
		this.add(writePanel);
	}

Button 3 wird nicht angezeigt, kann mir jemand helfen?
 
Ja, die werden komischer weise ausgeführt, hab das mit mehreren System.out.println() schon getestet
 
hmm keine Ahnung. probier halt mal was pasiert wenn du ein FlowLayout verwendest nur so zu Testzwecken.
Oder stell etwas mehr Code zur Verfügung 😀
 
Schreib mal als letzte Anweisung noch ein
Code:
validate();
in der Klasse dazu, die eine GUI-Änderung zur Laufzeit erfährt. Damit wird ein Neuzeichnen der Oberfläche angefordert. Diese Maßnahme wird immer dann notwendig, wenn zur Laufzeit GUI-Komponenten hinzugefügt, oder in ihrer Position geändert werden.
 
edit: in der DiaryPanel klasse die Methode showPanel(int count)
ist die Methode, die in das Lesen Fenster geladen wird.

Vielen Dank für die Hilfe!
 
nochmal edit: Die Buttons sind Platzhalten für die Eintrag-Panels.
Mein problem: immer wenn ich "speichern" klicke möchte ich, das ein neus Panel hinzugefügt wird (zu testzwecken ein button).
validate hat leider nicht funktioniert.
und morgen solls fertig sein 🙁
 
Hab dein Programm mal ausprobiert und überflogen.
Wenn du nach dem Speichern den Frame größer ziehst erscheinen danach die gesuchten Buttons, was darauf hinweist, dass ein validate() eingefügt werden muss.

Edit:
Achso, und du solltest es unbedingt vermeiden AWT- mit Swing-Komponenten zu mischen.
Die Klasse DiaryPanel erbt von Panel und die darin benutzten Komponenten sind aus dem AWT-Paket, während der Rest der Anwendung mit Swing arbeitet.
Und warum heißt die Referenz "mainPanel", wenn sie auf eine Instanz von java.awt.Container zeigt?
Wozu soll mainPanel benutzt werden?
 
Ich werde die komponenten auf Swing umstellen.
Komischerweise, wenn ich das Frame größer ziehe, erscheint bei mir nichts..

bzw. hast du eine Idee wie ich es realisieren kann, das immer wenn speichern geclickt wird, ein neuer Button hinzugefügt wird? (Den ich später durch ein Panel mit den Eintragsinformationen ersetzen werde).

Gerade habe ich gemerkt, das die Buttons ja im falschen JTabbedPane Fenster stehen...
Ich blick schon langsam garnichtmehr durch, ich möchte sie doch im "lesen" frame haben...

Danke für deine mühe!
 
edit: wenn ich es jetzt noch schaffe, das die buttons im anderen Tab angezeigt werden, werde ich es sicher schaffen alleine weiter zu kommen.

Danke das du dir bemühst mir zu helfen 😀
 
Anonymous hat gesagt.:
bzw. hast du eine Idee wie ich es realisieren kann, das immer wenn speichern geclickt wird, ein neuer Button hinzugefügt wird? (Den ich später durch ein Panel mit den Eintragsinformationen ersetzen werde).

Gerade habe ich gemerkt, das die Buttons ja im falschen JTabbedPane Fenster stehen...
Ich blick schon langsam garnichtmehr durch, ich möchte sie doch im "lesen" frame haben...
Wenn man dir helfen soll, musst du schon präzisere Angaben machen...

Ich hab deine Klasse DiaryPanel mal umgebaut, dass das funktioniert und du nur mit Swing-Elementen arbeitest:
Code:
package a3_tagebuch;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.text.*;

import javax.swing.*;

public class DiaryPanel extends JPanel{
   private JLabel datum,titel,pic,bb;
   private JTextField datumFeld,titelFeld;
   private JTextArea textFeld;
   private JButton jetzt,speichern,neu,bla;
   private Color back = new Color(213,232,255);
   private Font text1 = new Font("Trebuchet MS",Font.PLAIN,14);
   private JPanel datumPanel = new JPanel();
   private JPanel titelPanel = new JPanel();
   private JPanel textPanel = new JPanel();
   private JPanel buttonPanel = new JPanel();
   private JPanel writePanel = new JPanel();
   private JPanel mainPanel = new JPanel();
   //private GregorianCalendar cal = new GregorianCalendar(); //geändert, mit DateFormat realisiert
   private DateFormat formatter;
   private int count = 0;
   private int flag;
   private Image logo;
   private ImageIcon icon;
   private ArrayList<DiaryEintrag> eintragListe = new ArrayList();
   private GridBagLayout gbl = new GridBagLayout();
   private GridBagConstraints gbc = new GridBagConstraints();
   private GridBagLayout gbl1 = new GridBagLayout();
   private GridBagConstraints gbc1 = new GridBagConstraints();
   private GridLayout grid;
   private JPanel entryPanel = new JPanel();
   
   public DiaryPanel(int dFlag){
      flag = dFlag;
      if(flag == 0){
         writeMethod();
      }
      if(flag == 1){
         showPanel(count);
      }
      setFont(text1);
      logo = getToolkit().getImage("images/title.jpg");
      icon = new ImageIcon(logo);
      pic = new JLabel(icon, JLabel.CENTER);
      
      datum = new JLabel("Datum:");
      
      datumFeld = new JTextField("Format: 3.8.2007, 12:00", 30);
      jetzt = new JButton("Jetzt");
      jetzt.addActionListener(new ButtonHandler());
      
      titel = new JLabel("Titel:");
      titelFeld = new JTextField(37);
      
      textFeld = new JTextArea("Eintrag",22,41);
      textFeld.setLineWrap(true);
      
      speichern = new JButton("Speichern");
      speichern.addActionListener(new ButtonHandler());
      
      neu = new JButton("Neu");
      neu.addActionListener(new ButtonHandler());
      
      datumPanel.setLayout(new FlowLayout());
      titelPanel.setLayout(new FlowLayout());
      textPanel.setLayout(new FlowLayout());
      buttonPanel.setLayout(new FlowLayout());
      mainPanel.setLayout(gbl);
      datumPanel.add(datum);
      datumPanel.add(datumFeld);
      datumPanel.add(jetzt);
      
      titelPanel.add(titel);
      titelPanel.add(titelFeld);
      
      textPanel.add(new JScrollPane(textFeld));
      
      buttonPanel.add(speichern);
      buttonPanel.add(neu);
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.insets = new Insets(2,2,2,2);
      gbc.gridx = 0;  // x-Position im gedachten Gitter
      gbc.gridy = 0;  // y-Position im gedachten Gitter
      gbc.gridheight = 1;
      gbl.setConstraints(pic, gbc);
      mainPanel.add(pic);
      
      gbc.gridx=0; 
      gbc.gridy=1;
      gbc.gridheight = 1;
      gbl.setConstraints(datumPanel, gbc);
      mainPanel.add(datumPanel);
      
      gbc.gridx=0; 
      gbc.gridy=2;
      gbc.gridheight = 1;
      gbl.setConstraints(titelPanel, gbc);
      mainPanel.add(titelPanel);
      
      gbc.gridx=0; 
      gbc.gridy=3;
      gbc.gridheight = 1;
      gbl.setConstraints(textPanel, gbc);
      mainPanel.add(textPanel);
      
      gbc.gridx=0; 
      gbc.gridy=4;
      gbc.gridheight = 1;
      gbl.setConstraints(buttonPanel, gbc);
      mainPanel.add(buttonPanel);
      
      formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
   }

   public void writeMethod(){
      
      this.add(mainPanel);
   }

   public String getDate(){
      /*cal.setTimeZone(TimeZone.getTimeZone("CET"));
      String tempDate = cal.get(Calendar.DATE) + "." + (cal.get(Calendar.MONTH)+1) + "." + cal.get(Calendar.YEAR) + ", " + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE);
      return tempDate;*/
      return formatter.format(new Date());
   }

   /*public void paint(Graphics g) {
      g.setColor(back);
      g.fillRect(0,0,500,600);
      title = getToolkit().getImage("images/title.jpg");
      g.drawImage(title,129,10,this);
      g.setColor(Color.black);
   }*/

   public void showPanel(int count){
      writePanel.setLayout(new GridLayout(5,1));
      if(eintragListe.size() > 0){
         DiaryFrame fr = new DiaryFrame();
         DiaryEintrag ein = eintragListe.get(count);
         System.out.println("Datum: "+ein.getDatum()+"\nTitel: "+ein.getTitel()+"\nNummer: "+eintragListe.size()+"\nText: "+ein.getText()+"\n");

         writePanel.add(new JButton("3"));
      }
      writePanel.add(new JButton("1"));
      writePanel.add(new JButton("2"));
      this.add(writePanel);
      validate();
   }
   
   private class ButtonHandler implements ActionListener{
      public void actionPerformed (ActionEvent evt){
         if(evt.getSource() == jetzt){
            datumFeld.setText(getDate());
         }
         if(evt.getSource() == neu){
            int confirm = JOptionPane.showConfirmDialog(DiaryPanel.this, "Neuen Eintrag beginnen und Diesen verwerfen?", "Neuer Eintrag", JOptionPane.YES_NO_OPTION);
            if (confirm == JOptionPane.YES_OPTION) {
               datumFeld.setText("Format: 3.8.2007, 12:00");
               titelFeld.setText("");
               textFeld.setText("Eintrag:");
            }
         }
         if(evt.getSource() == speichern){
            JOptionPane.showMessageDialog(DiaryPanel.this,"Eintrag gespeichert");
            DiaryEintrag dEntry = new DiaryEintrag(count,titelFeld.getText(),datumFeld.getText(),textFeld.getText());
            eintragListe.add(dEntry);
            showPanel(count);
            count++;
         }
      }
   }
}

Deine Main-Class sieht bei mir jetzt so aus:
Code:
package a3_tagebuch;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class DiaryFrame extends JFrame{
   private JTabbedPane panes;
   
   public DiaryFrame(){
      super("Slider's Diary");
      setSize(500, 600);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      DiaryPanel writePanel = new DiaryPanel(0);
      DiaryPanel readPanel = new DiaryPanel(1);
      panes = new JTabbedPane();
      JPanel read = new JPanel();
      panes.addTab("Verfassen",writePanel);
      panes.addTab("Lesen",readPanel);
      getContentPane().add(panes);
   }
   public static void main(String args[]){
      new DiaryFrame().setVisible(true);
   }
}
 
Wow, finde es wirklich toll von Dir mir so zu helfen!
Bist du beruflich Programmierer?

Also zu dem vorher beschriebenen Problem:

Die add() Geschichte funktioniert jetzt wie ich es mir vorgestellt habe, mit dem Problem, das die Buttons im JTabbedPane in das(den) falschen Tab geschrieben werden, sprich neben das Eingabefenster.
Ich habe mittels JTabbedPane 2 "Registerkarten" erstellt, und in der Registerkarte "Lesen", sollen nun die Buttons (meine Platzhalter für die Eintrag-Panels hineingeschrieben werden.
Im Prinzip genau so, wie es momentan ist, nur eben nicht im "Verfassen" Tab.

Hast du vielleicht eine Idee, wie man das realisieren könnte?
Ich versuche es nun schon die ganze Zeit auf etliche Möglichkeiten, nur es ist das erste mal das ich mit JTabbedPane arbeite (und ich programmiere auch erst seit diesem Schuljahr objektorientiert)

Nochmal vielen Dank für deine Mühen, und das du mir als Anfänger hilfst!
 
Dazu benötigst du Zugriff auf das JTabbedPane-Objekt.
Das ist aber in deiner Main-Class implementiert. Um da ranzukommen müsstest du eine get()-Methode schreiben, die dir die Referenz auf das JTabbedPane-Objekt liefert, um damit dann die Buttons ins richtige Tab zu setzen.
Für meinen Geschmack ist das Ganze aber auch verkehrt angefangen worden.
Du solltest besser für das JPanel in dem Du Eingaben machst und das, in dem Du lesen willst jeweils ein eigenes Panel schreiben, nicht die Funktionalität für beide in eines packen und dann wieder müsham auseinander "polken".
So ist es auch einfacher die Button auf dem richtigen Panel unterzubringen.
 
Bzw. Ich würde die Komplette showPanel auch in einer eigenen Klasse realisieren. wenn ich die arrayList protected setze, müsste ich ja trotzdem darauf zugrifen können oder?
 
Das wird vom Design her nur immer schwerer zu handhaben.
Trenne das vernünftig, dann ist es übersichtlicher, weniger fehleranfällig und besser zu warten.
 
Wie kann ich am besten eine get Methode für eine ArrayList schreiben?
 
OK, ich glaub es hat sich erübrigt:

public ArrayList getList(){
return eintragListe;
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben