Problem mit dem Layout - 3 JPanel's

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

Stegi

Gast
Hi,

habe ein fragen. Ich will mein Fenster in zwei teile teilen. Ich weis aber nicht mit welchen Layout typ ich das hinkriege.
das ergebnis soll so aussehen:
..........................................
: :
: :
: :
: :
: :
: :
: :
: :
:........................................:
: :
:........................................:

mit dem GridLayout(2,0) teil er das ding genau in der hälte, dass sollst aber nicht!

hmm.... hab es nicht besonders gut erklärt nehme ich an. Aber ich hoffe mir kann trozdem wer helfen!

danke!
 
hm du könntest eine bzw. zwei JSplitPanes benutzen, dort deine komponenten links und rechts hinsetzen und die splitpane dem frame adden.

oder du benutzt nen BorderLayout.
aus deiner zeichnung werd ich auch nich schlau
 
ich habe schon so viel versucht. sämtlich Layout Manager oder setLayout(null). Aber es klappt nichts.

ich liste mal den code

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import java.io.*;

public class Kalaha extends JFrame implements ActionListener {
  // Anfang Variablen
  private ButtonGroup menuSettingBeginnerModus;
  BufferedImage bild;                            //Referenz auf das aktuelle Bild
  BildLeinwand leinwand, startbild;                         //JPanel zum Anzeigen des Bildes
  // Ende Variablen

  
  //inner Klasse zum Überschreiben von paintComponent()
  class BildLeinwand extends JPanel{
    public void paintComponent(Graphics g){
      if(bild!=null)
        g.drawImage(bild, 0, 0, this);
    }
  }
  public Kalaha(final String title) {

    // Frame-Initialisierung
    super(title);
    startbild = new BildLeinwand();
    getContentPane().add(startbild, BorderLayout.CENTER);
    addWindowListener(new WindowAdapter() {
      public void windowOpened(final WindowEvent evt){ startBild();  }
      public void windowClosing(final WindowEvent evt) { System.exit(0); }
    });
    final int frameWidth = 810;
    final int frameHeight = 580;
    setSize(frameWidth, frameHeight);
    Container cp = getContentPane();
    // Anfang Komponenten
    //Menüleiste
    JMenuBar menuLeiste = erzeugeMenueLeiste();
    setJMenuBar(menuLeiste);

    //Eine Leinwand anlegen (von JPanel abgeleitet)
    leinwand = new BildLeinwand();
    cp.add(leinwand, BorderLayout.CENTER);

    // Ende Komponenten

    setVisible(true);
  }
  // Stellt die Menüleiste zusammen
  private JMenuBar erzeugeMenueLeiste(){
    ....
    
    return menueLeiste;
  }
  // Anfang Ereignisprozeduren
  public void actionPerformed(ActionEvent e){
    if(e.getActionCommand().equals("Beenden"))
    { int auswahl = JOptionPane.showConfirmDialog(this,
                       "Möchten Sie wirklich das Spiel beenden?", "Spiel beenden?",
                       JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
      if(auswahl==JOptionPane.YES_OPTION)
       System.exit(0);
    }
    if(e.getActionCommand().equals("Neues Spiel")){
      bildOeffnen();
    }
  }
  // Ende Ereignisprozeduren
  //Methode zum öffnen des aktuellen Bildes
  protected void bildOeffnen(){
    try{
      bild = ImageIO.read(new File("images/brett_o.png"));
      leinwand.repaint();
    }catch(IOException e){
      bild = null;
    }
  }
  protected void startBild(){
    try{
      bild = ImageIO.read(new File("images/kalaha.png"));
      leinwand.repaint();
    }catch(IOException e){
      bild = null;
    }
  }
  public static void main(final String[] args) {
    new Kalaha("Kalaha");
  }
}

Es funkt ja soweit zu beginn, also mit dem öffnen wird das startbild geladen.
dann wenn ich über <Spiele> <neues Spiel> klicken kommt ein neues Bild, aber diese Bild soll nun dich die gesamte fläsche belegen, sonder ich will unter einen Streifen frei lassen, wo ich Labels etc. einbauen kann (für Spielstände und Infos)

Kann mir wer helfen?
 
Hallo,

du solltest folgendes probieren... so wie das ausschaut, möchtest du oben etwas darstellen und unten so ne art buttonview basteln die fest ist:

baue für jede darstellung eine eigene view (... extends jpanel) die du dann in einem "mainjpanel" mit borderlayout zusammenfügst. Dort nimmst du den oberen teil als Borderlayout.CENTER und das, was du unten darstellen möchtest als Borderlayout.SOUTH. Welchen Layoutmanager die Komponenten haben ist egal. Unten könnten z. b. die buttons mit nem flowlayout zusammengesetzt sein.
Wichtig ist nur, das die views wieder in einem jpanel mit layoutmanager zusammengebaut werden. Dadurch erhältst du noch nebenbei eine schöne Gliederung, die dein code übersichtlicher macht.

Noch ein Tip: der Mainframe wird grad von dir für alles mögliche hergenommen.
lagere den mainframe noch aus als eigene klasse und baue dann eine art "runner"
der nichts anderes tut als den mainframe zu instanzieren und zu starten.

z. B. so

Code:
public class MainApp {

	public static void main(String[] args) {
		TestFrame frame = new TestFrame();
		frame.setTitle("DirectoryTree");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);

	}
}


der testframe (uhm, jetzt mainframe..) schaut dann ungefähr so aus:

Code:
public class MainFrame extends JFrame {
	
...

	public MainFrame() {
		listeners = new ArrayList();
		
		MainFrameController controller = new MainFrameController();
		
		BorderLayout layout = new BorderLayout();
		getContentPane().setLayout(layout);
		
		main = new SqlBrowserView();
		getContentPane().add(main, BorderLayout.CENTER);
		main.addActionListener(controller);
		
		JMenuBar bar = new JMenuBar();
		
		JMenu file = new JMenu("File"); 
		bar.add(file);

		JMenuItem item1 = new JMenuItem("open");
		file.add(item1);
		file.addSeparator();
		
		JMenuItem item2 = new JMenuItem("Exit");
		file.add(item2);
		item2.addActionListener(controller);
		item2.setActionCommand(AllActionCommands.ACTION_EXIT);
		
		getContentPane().add(bar, BorderLayout.NORTH);
		setSize(1000, 500);
		
		addWindowListener(controller);
		
	}
...
}


Die hier eingefügte SqlBrowserView ist genau so eine view mit oben ein paar eingabefeldern, in der mitte ein freies
feld und unten eine buttonview (das wäre dann bei dir die sache mit den spielständen, etc.) -> alles eigene views die
von jpanel abgeleitet sind.

Code:
...
	public SqlBrowserView() {
		listeners = new ArrayList();

		head = new KopfzeileView();
		browser = new BrowserView(); 
		fuss = new FussZeileView();
		
		BorderLayout layout = new BorderLayout();
		setLayout(layout);
		add(head, BorderLayout.NORTH);
		add(browser, BorderLayout.CENTER);
		add(fuss, BorderLayout.SOUTH);
		
		fuss.addActionListener(new SqlBrowserController());
	}
...

so, ich hoffe, ich hab deine frage nich völlig falsch verstanden und konnte dir ein wenig weiterhelfen......
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben