Tic Tac Toe Layout-Sorgen

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
Guten Abend,
Ich arbeite gerade an einem grafischen TicTacToe und habe Probleme mit dem Layout:

Hab ich das GridLayout einmal mit den Panels gefüllt, kann ich sie nicht mehr überschreiben / überzeichnen. Wenn ich mit meiner Klasse "Cross" ein Kreuz machen will, wird dessen paintComponent-Methode nicht aufgerufen.

hier ein bisschen Code, womit das Layout erstellt wird:

Code:
public void setUp()
	{
		label = new JLabel("Klick on the grid");
		
		this.setLayout(new BorderLayout());
		
		// set up GamePanel
		gamePanel = new JPanel();
		gamePanel.setLayout(new GridLayout(3,3));
		gamePanel.setBorder(new EtchedBorder());
		
		// set up GridPanel
		setGridPanel();
		
		c = new Cross(100,100);
		p1 = c.getPanel();
		
		this.add(gamePanel, BorderLayout.CENTER);
		this.add(label, BorderLayout.SOUTH);
		
		frame = new JFrame("Tic Tac Toe");
		frame.add(this);
		frame.setSize(300,300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
	}
	
	public void setGridPanel()
	{
		p1 = new JPanel();
		p1.setPreferredSize(new Dimension(100,100));
		p1.setBorder(new EtchedBorder());
		gamePanel.add(p1);
		
		p2 = new JPanel();
		p2.setPreferredSize(new Dimension(100,100));
		p2.setBorder(new EtchedBorder());
		gamePanel.add(p2);
		
		p3 = new JPanel();
		p3.setPreferredSize(new Dimension(100,100));
		p3.setBorder(new EtchedBorder());
		gamePanel.add(p3);
		
		p4 = new JPanel();
		p4.setPreferredSize(new Dimension(100,100));
		p4.setBorder(new EtchedBorder());
		gamePanel.add(p4);
		
		p5 = new JPanel();
		p5.setPreferredSize(new Dimension(100,100));
		p5.setBorder(new EtchedBorder());
		gamePanel.add(p5);
		
		p6 = new JPanel();
		p6.setPreferredSize(new Dimension(100,100));
		p6.setBorder(new EtchedBorder());
		gamePanel.add(p6);
		
		p7 = new JPanel();
		p7.setPreferredSize(new Dimension(100,100));
		p7.setBorder(new EtchedBorder());
		gamePanel.add(p7);
		
		p8 = new JPanel();
		p8.setPreferredSize(new Dimension(100,100));
		p8.setBorder(new EtchedBorder());
		gamePanel.add(p8);
		
		p9 = new JPanel();
		p9.setPreferredSize(new Dimension(100,100));
		p9.setBorder(new EtchedBorder());
		gamePanel.add(p9);}
 

hdi

Top Contributor
Wie sieht denn deine Klasse Cross aus? Ist das ein JPanel und getPanel() returned this?
Dann müsste es eigentlich funktionieren.
 

kulturfenster

Bekanntes Mitglied
ja,

Code:
public class Cross extends JPanel
...
public JPanel getPanel() {
   return this;
}

Dies Cross-Klasse funktioniert, die hab ich getestet.[/code]
 

hdi

Top Contributor
Ja also du könntest testen ob's vllt ein repaint() nach der kompletten Initialisierung bringt, also
nachdem das Fenster angezeigt ist (auf gamePanel).
In Verbindung damit könntest du dir eine Sysout meldung in die paintComponent von Cross einbauen,
nur um sicherzugehen, ob sie wirklich nicht aufgerufen wird.

Verstehe nicht wieso das nicht geht...
 

kulturfenster

Bekanntes Mitglied
hmm, das hab ich beides auch schon ausprobiert. :(

Ich vermute, dass setGridPanel-Methode alles blockiert, Zuerst hatte ich nämlich nur das GridPanel eingerichtet und dann dort gleich überall ein Kreuz reingezeichnet. Dies hat problemlos funktioniert...
 

Ebenius

Top Contributor
Der Code oben gibt immer noch nicht genügend Information, warum's nicht funktioniert.

Aber der Ansatz ist eigentlich nicht so sehr chique. Zum Zeichnen kann man super sowas machen:
Code:
enum TicTacToeValue {
  /** The field is empty */
  EMPTY,

  /** The field is marked with the cross */
  CROSS,

  /** The field is marked with a disc */
  DISC;
}

interface TicTacToeModel {

  /**
   * Resets the whole empty. All values are set to {@link TicTacToeValue#EMPTY}
   * .
   */
  void resetAll();

  /**
   * Get the field value at the given row and column.
   * 
   * @param row the row index
   * @param column the column index
   * @return the field value
   * @throws IndexOutOfBoundsException if row or column are out of bounds
   */
  TicTacToeValue getFieldValueAt(int row, int column);

  /**
   * Set the field value at the given row and column.
   * 
   * @param value the field value to set
   * @param row the row index
   * @param column the column index
   * @throws IndexOutOfBoundsException if row or column are out of bounds or
   *           if the old field value is not {@link TicTacToeValue#EMPTY}
   */
  void setFieldValueAt(TicTacToeValue value, int row, int column);

  /**
   * Add the given change listener to <code>this</code> model. Does not check,
   * whether the listener is already registered. If so, the listener is added
   * once more.
   * 
   * @param listener the listener to add
   */
  void addChangeListener(ChangeListener listener);

  /**
   * Remove the given change listener from <code>this</code> model. Nothing
   * happens, if the given listener is not in the list of event listeners. If
   * the same listener is registered more than once, the first instance is
   * removed, only.
   * 
   * @param listener the listener to remove
   */
  void removeChangeListener(ChangeListener listener);
}

class DefaultTicTacToeModel implements TicTacToeModel, java.io.Serializable {

  // -------------------------------------------------------------------------
  // Instance fields
  // -------------------------------------------------------------------------

  /** Listener list for all listeners handled */
  private EventListenerList listeners;

  /** Field values 3x3 */
  private final TicTacToeValue[][] values;

  // -------------------------------------------------------------------------
  // Constructors
  // -------------------------------------------------------------------------

  /** Creates a new <code>DefaultTicTacToeModel</code>. */
  public DefaultTicTacToeModel() {
    values = new TicTacToeValue[3][3];
    resetAll();
  }

  // -------------------------------------------------------------------------
  // Implementing TicTacToeModel
  // -------------------------------------------------------------------------

  public void resetAll() {
    for (int row = 0; row < values.length; row++) {
      Arrays.fill(values, TicTacToeValue.EMPTY);
    }
    fireStateChanged();
  }

  public TicTacToeValue getFieldValueAt(int row, int column) {
    return values[row][column];
  }

  public void setFieldValueAt(TicTacToeValue value, int row, int column) {
    if (value == null) {
      throw new IllegalArgumentException( //
            "value not allowed null"); //$NON-NLS-1$
    }
    if (getFieldValueAt(row, column) != TicTacToeValue.EMPTY) {
      throw new IllegalArgumentException(
            "Field is already assigned at column: " //$NON-NLS-1$
                  + column
                  + " row:" + row); //$NON-NLS-1$
    }
    values[row][column] = value;
    fireStateChanged();
  }

  /**
   * Adds the {@link ChangeListener} to <code>this</code> instance.
   * 
   * @param listener the listener to add
   */
  public void addChangeListener(ChangeListener listener) {
    listeners = listeners == null ? new EventListenerList() : listeners;
    listeners.add(ChangeListener.class, listener);
  }

  /**
   * Removes the {@link ChangeListener} from <code>this</code> instance.
   * 
   * @param listener the listener to remove
   */
  public void removeChangeListener(ChangeListener listener) {
    if (listeners != null) {
      listeners.remove(ChangeListener.class, listener);
    }
  }

  /** Fires a {@link ChangeEvent} to all listeners. */
  protected void fireStateChanged() {
    if (listeners == null) {
      return;
    }

    ChangeEvent event = null;
    final Object[] list = listeners.getListenerList();
    for (int idx = 0; idx < list.length; idx += 2) {
      if (list[idx] == ChangeListener.class) {
        if (event == null) {
          event = new ChangeEvent(this);
        }
        ((ChangeListener) list[idx + 1]).stateChanged(event);
      }
    }
  }
}

class TicTacToeCellPanel extends JComponent implements ChangeListener {

  // -------------------------------------------------------------------------
  // Instance fields
  // -------------------------------------------------------------------------

  private final int row;
  private final int column;
  private TicTacToeModel model;

  // -------------------------------------------------------------------------
  // Constructors
  // -------------------------------------------------------------------------

  /** Creates a new <code>TicTacToeCellPanel</code>. */
  public TicTacToeCellPanel(TicTacToeModel model, int row, int column) {
    setModel(model);
    this.row = row;
    this.column = column;
    setPreferredSize(new Dimension(100, 100));
  }

  // -------------------------------------------------------------------------
  // Bean getters and setters
  // -------------------------------------------------------------------------

  /**
   * Returns the model.
   * 
   * @return the model
   */
  public TicTacToeModel getModel() {
    return model;
  }

  /**
   * Sets the model.
   * 
   * @param model the model to set
   * @throws NullPointerException if <code>model</code> is <code>null</code>
   */
  public void setModel(TicTacToeModel model) {
    final TicTacToeModel old = this.model;
    if (old != null) {
      old.removeChangeListener(this);
    }
    model.addChangeListener(this);
    this.model = model;
    repaint();
    firePropertyChange("model", old, model); //$NON-NLS-1$
  }

  // -------------------------------------------------------------------------
  // Listening to the model
  // -------------------------------------------------------------------------

  @Override
  public void stateChanged(ChangeEvent e) {
    if (model == e.getSource()) {
      repaint();
    }
  }

  // -------------------------------------------------------------------------
  // Painting code
  // -------------------------------------------------------------------------

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    final TicTacToeValue value = model.getFieldValueAt(row, column);
    switch (value) {
    case CROSS:
      // paint cross here
      break;
    case DISC:
      // paint disc here
      break;
    case EMPTY:
      // don't paint anything
      break;
    }
  }
}

Dann brauchst Du nur noch neun TicTacToeCellPanels auf Dein Panel werfen, allen das gleiche Modell geben und dann arbeitest Du nur noch auf dem Modell.

Muss man nicht. Ich find's aber schöner. Ich hoffe ich hab an alles gedacht. :)

Just my $0.02
 

kulturfenster

Bekanntes Mitglied
wow, da hast du aber Gas gegeben! Das ist bestimmt chiquer als mein Ansatz..

trotzdem würde ich meinen Ansatz gerne vervollständen, damit was von der Übung profitiere.

ich poste also mal die beiden Klassen (Cross beinhaltet eine Test-main):

Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.Dimension;

public class Cross extends JPanel
{
	private Point2D.Double p1;
	private Point2D.Double p2;
	private Point2D.Double p3;
	private Point2D.Double p4;
	
	private Line2D.Double line1;
	private Line2D.Double line2;
	
	public Cross(int width, int height)
	{
		this.setSize(new Dimension(width,height));

		p1 = new Point2D.Double(this.getWidth() / 3, this.getHeight() / 3);
		p2 = new Point2D.Double(this.getWidth() * 2/3, this.getHeight() * 2/3);
		p3 = new Point2D.Double(this.getWidth() * 2/3, this.getHeight() / 3);
		p4 = new Point2D.Double(this.getWidth() / 3, this.getHeight() * 2/3);

//		p1 = new Point2D.Double(100,10);
//		p2 = new Point2D.Double(20,20);
		line1 = new Line2D.Double(p1,p2);
		line2 = new Line2D.Double(p3,p4);
	}
	
	public void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
		g2.draw(line1);
		g2.draw(line2);
		System.out.println("zeichnet!");
	}
	
	public JPanel getPanel()
	{
		return this;
	}
	
	public static void main(String[] args)
	{
		Cross c = new Cross(100,100);
		
		JFrame frame = new JFrame("Kreuz-Test");
		frame.add(c.getPanel());	
		frame.setSize(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;

import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.border.EtchedBorder;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class GUI extends JPanel //implements MouseListener
{
	private JFrame frame;
	private JPanel mainPanel;
	private JPanel gamePanel;
	private JLabel label;
	
	// fields for gamePanel
	private JPanel p1;
	private JPanel p2;
	private JPanel p3;
	private JPanel p4;
	private JPanel p5;
	private JPanel p6;
	private JPanel p7;
	private JPanel p8;
	private JPanel p9;
	private JPanel p10;
	
	Cross c;
	
	public GUI()
	{
		setUp();
		
		
		
	}
	
	public void setUp()
	{
		label = new JLabel("Click on the grid");
		
		this.setLayout(new BorderLayout());
		
		// set up GamePanel
		gamePanel = new JPanel();
		gamePanel.setLayout(new GridLayout(3,3));
		gamePanel.setBorder(new EtchedBorder());
		
		// set up GridPanel
		setGridPanel();
		
		c = new Cross(100,100);
		p1 = c.getPanel();
		c.repaint();
		
		
		this.add(gamePanel, BorderLayout.CENTER);
		this.add(label, BorderLayout.SOUTH);
		
		frame = new JFrame("Tic Tac Toe");
		frame.add(this);
		frame.setSize(300,300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	public void setGridPanel()
	{
		p1 = new JPanel();
		p1.setPreferredSize(new Dimension(100,100));
		p1.setBorder(new EtchedBorder());
		gamePanel.add(p1);
		
		p2 = new JPanel();
		p2.setPreferredSize(new Dimension(100,100));
		p2.setBorder(new EtchedBorder());
		gamePanel.add(p2);
		
		p3 = new JPanel();
		p3.setPreferredSize(new Dimension(100,100));
		p3.setBorder(new EtchedBorder());
		gamePanel.add(p3);
		
		p4 = new JPanel();
		p4.setPreferredSize(new Dimension(100,100));
		p4.setBorder(new EtchedBorder());
		gamePanel.add(p4);
		
		p5 = new JPanel();
		p5.setPreferredSize(new Dimension(100,100));
		p5.setBorder(new EtchedBorder());
		gamePanel.add(p5);
		
		p6 = new JPanel();
		p6.setPreferredSize(new Dimension(100,100));
		p6.setBorder(new EtchedBorder());
		gamePanel.add(p6);
		
		p7 = new JPanel();
		p7.setPreferredSize(new Dimension(100,100));
		p7.setBorder(new EtchedBorder());
		gamePanel.add(p7);
		
		p8 = new JPanel();
		p8.setPreferredSize(new Dimension(100,100));
		p8.setBorder(new EtchedBorder());
		gamePanel.add(p8);
		
		p9 = new JPanel();
		p9.setPreferredSize(new Dimension(100,100));
		p9.setBorder(new EtchedBorder());
		gamePanel.add(p9);
	}
	
	public static void main(String[] args)
	{
		new GUI();
	}
	
}
 

Ebenius

Top Contributor
In Zeile 57 / 58 erzeugst Du zwar das Cross. Aber Du bringst es nicht auf das gamePanel. Da ist doch das alte p1 drauf, was in setUp() gesetzt wird. Wenn Du Zeile 59 löschst und dadurch ersetzt, wird's Dir angezeigt:
Code:
// altes p1 löschen
gamePanel.remove(0);
// neues p1 setzen
gamePanel.add(p1, 0);

Ebenius
 

kulturfenster

Bekanntes Mitglied
violà, ich danke!

Nun merke ich langsam, dass ich wohl doch auf deine Lösung zurückkommen werden müssen... :roll:
 

kulturfenster

Bekanntes Mitglied
nun hab ich doch noch ein Problem.
ich finde, es wird immer wüster hier.

Problem:
Ich rufe 2x eine Methode auf mit dem gleichen Parameter, doch der Output ist unterschiedlich. Kann das überhaupt sein??

Ich habe nun eine Methode geschrieben, welches mir das gewünschte Panel des GridLayouts auswechselt und ein Kreuz zeichnet.

Zuerst hab ich einen Test mit einem direkten Aufruf gemacht, was funktioniert hat.
Dann hab ich einen MouseListener implementiert, der der Methode den gleichen Wert geschickt hat, nur wurde dann die paintComponent-Methode nicht aufgerufen.

hier die neue Methode:

Code:
public void setCross(int move)
	{		
		c = new Cross(100,100);
		JPanel p;
		
		gamePanel.remove(move-1);
	
		p = c.getPanel();
		p.setBorder(new EtchedBorder());
		gamePanel.add(p,move-1);
		System.out.println(move);
	}

Wie gesagt, "move" ist immer gleich. Doch wenn der Aufruf von dem MouseListener kommt, geschieht nix.

Der MouseListener wurde mittels einer inneren Klasse implementiert. Macht das einen Unterschied?
 

hdi

Top Contributor
In Zeile 57 / 58 erzeugst Du zwar das Cross. Aber Du bringst es nicht auf das gamePanel. Da ist doch das alte p1 drauf

Ich hatte mich auch lange gefragt ob das der Grund sein könnte, dachte dann aber das passt schon.
Aber ich glaub jetz check ich's: Da es in java kein echtes call by reference gibt, funktioniert das ganze nur solange
man der Variablen nicht per "new" ein neues Objekt zuweist. (Methoden auf p1 würden aber greifen) Right?
Will das nur bestätigt haben weil das is ja schon ziemliches Fundamentalwissen.
Langweilt mich grad dass ich das nicht weiss :?
 

kulturfenster

Bekanntes Mitglied
Ich verstehe auch noch einges nicht:

Da es in java kein echtes call by reference gibt, funktioniert das ganze nur solange
man der Variablen nicht per "new" ein neues Objekt zuweist.
Könntest du mir das etwas genauer erklären?

Zudem hab ich nun folgendes Problem:

Ich hab bei meinem TicTacToe Layout ja ein GridLayout verwendet und dann jedes Feld mit einem Panel gefüllt, welches ich dann mit einer Disk oder einem Cross bemalen will.

Wenn ich nun aber den Konstruktor der Cross-Klasse mit einem x- und y-Wert eines Feldes aufrufe, also
Code:
c = new Cross(gamePanel.getWidth() / 3, gamePanel.getHeight() / 3);
zeichnet mir die Cross-Klasse natürli hstehts in das erste Feld (oben Links).

Wie kann ich der Cross-Klasse mitteilen, in welches Feld sie zeichnen soll?
(keine Ahnung, ob ich gerade vor lauter Bäume den Wald nicht mehr sehe...)
 

kulturfenster

Bekanntes Mitglied
ok, danke für den Link!

wegen meinem anderen Problem:

Ich hab nun den Konstruktor der Cross-Klasse angepasst, so dass ich ihm die x- und y-Werte des jeweiligen Feldes mitschicken kann.

im Konstruktor selbst hab ich diese Koordinatenwerte dann folgendermassen aktualisiert:
Code:
this.setAlignmentX(x);
this.setAlignmentY(y);
Doch leider beziehen sich alle meine Kreuz-Instruktionen immer noch auf das gamePanel, weshalb das Kreuz mir stets in das erste Feld gezeichnet wird.

versteht hier noch jemand, um was es geht? :bahnhof:

kurz: wie kann ich die Koordinaten eines Panels anpassen?
 

Ebenius

Top Contributor
hdi hat gesagt.:
Da es in java kein echtes call by reference gibt, ...
Das hat mit "call by reference" nix zu tun. Da war doch gar kein Aufruf. Das Kreuz wurde einfach einer Variablen zugewiesen aber eben nicht der Kinder-Liste des Panels.
hdi hat gesagt.:
... funktioniert das ganze nur solange
man der Variablen nicht per "new" ein neues Objekt zuweist. (Methoden auf p1 würden aber greifen) Right?
Will das nur bestätigt haben weil das is ja schon ziemliches Fundamentalwissen.
Langweilt mich grad dass ich das nicht weiss :?
Der Teil stimmt.
 

Ebenius

Top Contributor
kulturfenster hat gesagt.:
Ich hab bei meinem TicTacToe Layout ja ein GridLayout verwendet und dann jedes Feld mit einem Panel gefüllt, welches ich dann mit einer Disk oder einem Cross bemalen will.

Wenn ich nun aber den Konstruktor der Cross-Klasse mit einem x- und y-Wert eines Feldes aufrufe, also
Code:
c = new Cross(gamePanel.getWidth() / 3, gamePanel.getHeight() / 3);
zeichnet mir die Cross-Klasse natürli hstehts in das erste Feld (oben Links).

Wie kann ich der Cross-Klasse mitteilen, in welches Feld sie zeichnen soll?
(keine Ahnung, ob ich gerade vor lauter Bäume den Wald nicht mehr sehe...)
Hier verwechselst Du was. Du willst doch dem Cross-Panel nur die Größe mitgeben. Alignment-X und -Y haben damit nix zu tun; GridLayout interessiert sich für die Werte gar nicht.

Das GridLayout setzt die Komponenten in der Reihenfolge, wie sie auf dem Kontainer liegen. Also: Komponente 0 liegt immer links oben. An der Stelle wo Du "remove(0)" sagst und "add(..., 0)" musst Du die 0 ersetzen durch den richtigen Index ersetzen. Dann gehts.

Verstanden?
 

kulturfenster

Bekanntes Mitglied
Du willst doch dem Cross-Panel nur die Größe mitgeben.
ja, aber diese Grösse bezieht sich leider jeweils auf den Koordinatenursprung des gamePanels. deshalb hab ich nun versucht mittels setAlignment den Ursprung des zu bezeichnenden Panels neu zu definieren.

welches Panel ich austausche, das habe ich schon angepasst. "move" beinhaltet die Nummer des Feldes, welches angeklickt wurde.
Code:
c = new Cross2(x,y, gamePanel.getWidth() / 3 , gamePanel.getHeight() / 3);
		JPanel p;
		
		gamePanel.remove(move-1);
	
		p = c.getPanel();
		p.setBorder(new EtchedBorder());
		gamePanel.add(p,move-1);
		c.repaint();
		System.out.println("add " + move);
 

Ebenius

Top Contributor
kulturfenster hat gesagt.:
ja, aber diese Grösse bezieht sich leider jeweils auf den Koordinatenursprung des gamePanels. deshalb hab ich nun versucht mittels setAlignment den Ursprung des zu bezeichnenden Panels neu zu definieren.
Nein. Die Größe einer Komponente bezieht sich stets nur auf die eigene linke obere Ecke.

Ebenius
 

kulturfenster

Bekanntes Mitglied
aber dann sollte doch meine setCross-Methode folgendes tun:
- sie bekommt die Nummer des Panels, welches sie mit einem X versehen soll.
- sie removed das alte Panel an dieser Stelle
- sie fügt das neue hinzu
- repaint

Doch das funktioniert leider nicht.

hier meine komplette Methode:
Code:
public void setCross(int move)
	{
		c = new Cross(gamePanel.getWidth() / 3, gamePanel.getHeight() / 3);
		JPanel p;
		
		gamePanel.remove(move-1);
	
		p = c.getPanel();
		p.setBorder(new EtchedBorder());
		gamePanel.add(p,move-1);
		c.repaint();
		System.out.println("add " + move);
	}

Oder hab ich was übersehen?
 

Ebenius

Top Contributor
Tausch mal die repaint-Zeile aus gegen
Code:
gamePanel.revalidate();
gamePanel.repaint();

Geht's dann?
 

kulturfenster

Bekanntes Mitglied
juhee, das funktioniert! :D

was tut revalidate() genau? Die API habe ich leider aus technisch-englischen Gründen nicht verstanden...

aber Danke schon mal für die Hilfe + Geduld!
 

Ebenius

Top Contributor
Setzt das valid-Flag auf false (valid bedeutet, das layout des Kontainers stimmt) und ruft dann validate() über den Event Dispatcher Thread auf. Validate wiederum ruft doLayout() auf, wenn ein Kontainer nicht valid ist. doLayout ruft den LayoutManager des Kontainers auf, und der setzt die Position und Größen aller Kinder des Kontainers.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
S setContentView(R.Layout.XXX) wird Rot angezeigt Java Basics - Anfänger-Themen 0
C Erste Schritte Layout an Bildschirmauflösung anpassen Java Basics - Anfänger-Themen 9
N Project layout eclipse ( seperate ordner für klassen ? ) Java Basics - Anfänger-Themen 1
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
N Erste Schritte JOptionPane - zerstörtes Layout Java Basics - Anfänger-Themen 2
R Card Layout refresh nach Änderung Java Basics - Anfänger-Themen 1
P welche Komponente ist im Layout? Java Basics - Anfänger-Themen 2
F Welchen Layout Manager wählen? Java Basics - Anfänger-Themen 13
Q Layout Manager Java Basics - Anfänger-Themen 6
llabusch Layout neu zeichnen lassen Java Basics - Anfänger-Themen 2
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
T Layout Java Basics - Anfänger-Themen 9
L Anderes Layout für JOptionPane? Java Basics - Anfänger-Themen 6
N Datum abgleichen und Frage zum Layout Java Basics - Anfänger-Themen 3
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
M Text linksbündig im Box'ed Layout Java Basics - Anfänger-Themen 4
M Interface Das Null-Layout Java Basics - Anfänger-Themen 12
P GUI - Layout per Laufzeit erstellen/verändern? Java Basics - Anfänger-Themen 6
B Daten eingeben und ausgeben mit einem Layout Java Basics - Anfänger-Themen 17
L Erste Schritte Layout eines Java Programms Java Basics - Anfänger-Themen 5
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
JAVAnnik layout erstellen Java Basics - Anfänger-Themen 24
R Welcher Layout Manager-für so ein Fenster? Java Basics - Anfänger-Themen 5
J Unterschiedliche Spaltengröße im Grid(bag)layout Java Basics - Anfänger-Themen 6
M Layout einfach bilden Java Basics - Anfänger-Themen 4
F Card Layout Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
L Layout Frage Java Basics - Anfänger-Themen 2
N GUI-Layout-Problem&Anordnung Java Basics - Anfänger-Themen 14
M Frage zu GUI-Layout Java Basics - Anfänger-Themen 4
N Welches Layout soll ich verwenden? Java Basics - Anfänger-Themen 3
W Unterschied JFrame und JLabel bezüglich Layout? Java Basics - Anfänger-Themen 2
N Layout Probleme Java Basics - Anfänger-Themen 2
J Layout bei Swing Java Basics - Anfänger-Themen 4
W Grid Layout wird falsch dargestellt Java Basics - Anfänger-Themen 4
S Layout JDialog Java Basics - Anfänger-Themen 9
T Border Layout alle mittleren felder gleich groß Java Basics - Anfänger-Themen 3
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
T Eine doofe Frage zum null-Layout-Manager Java Basics - Anfänger-Themen 6
M Layout Probleme Java Basics - Anfänger-Themen 10
T Layout Problem Java Basics - Anfänger-Themen 2
B Frage zum Layout Java Basics - Anfänger-Themen 6
M zufällige auswahl eines Panels aus Grid Layout Java Basics - Anfänger-Themen 3
K Layout Java Basics - Anfänger-Themen 6
J Layout Java Basics - Anfänger-Themen 8
B package org.jdesktop.layout does not exist Java Basics - Anfänger-Themen 8
A center in einer border layout Java Basics - Anfänger-Themen 8
E Layout für Prozentaufteilung Java Basics - Anfänger-Themen 3
A Problem mit BorderLayout und null-Layout Java Basics - Anfänger-Themen 5
N Bildbeispiel von Layout: wie nutze ich das GBLayout dafür? Java Basics - Anfänger-Themen 17
mwildam JToolBar und Group-Layout (NetBeans) dockt nicht richtig an Java Basics - Anfänger-Themen 3
Q Classe durch Buttonklick im Layout öffnen Java Basics - Anfänger-Themen 4
A frames layout Java Basics - Anfänger-Themen 4
G Bilder im Grid-Bag-Layout Java Basics - Anfänger-Themen 2
H Layout wird nicht eingehalten . Java Basics - Anfänger-Themen 3
G Welcher Layout-Manager? *confused* Java Basics - Anfänger-Themen 2
D Layout beim Applet Java Basics - Anfänger-Themen 6
G Layout Java Basics - Anfänger-Themen 3
G Layout Java Basics - Anfänger-Themen 9
U Welches Layout? Java Basics - Anfänger-Themen 6
I Layout anpassen Java Basics - Anfänger-Themen 4
L Layout Problem Java Basics - Anfänger-Themen 2
J Tabelle erneuert bei Card Layout nicht Java Basics - Anfänger-Themen 2
S Layout Probleme (Kein Adden möglich) Java Basics - Anfänger-Themen 18
M ScrollPane Flow Layout Java Basics - Anfänger-Themen 4
P Null Layout Java Basics - Anfänger-Themen 17
R JPanel und Layout Java Basics - Anfänger-Themen 4
Bierhumpen Swing und Layout Java Basics - Anfänger-Themen 18
M JButton im JLabel Layout Java Basics - Anfänger-Themen 12
Z JButton vs Layout Java Basics - Anfänger-Themen 8
E Scrollbar mit NULL- Layout? Java Basics - Anfänger-Themen 4
L Swing - Layout-Problem Java Basics - Anfänger-Themen 12
B Null-Layout oder GridLayout usw. Java Basics - Anfänger-Themen 5
L Layout Java Basics - Anfänger-Themen 5
DEvent anfängerfrage: wieso layout erst beim verändern? Java Basics - Anfänger-Themen 6
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben