Eigene JComponent in GridLayout

LatinFavourite

Bekanntes Mitglied
Hallo alle zusammen,

ich habe das Problem, meine eigenen Komponenten im GridLayout anzuordnen. Sie werden immer untereinander und mit einem großen Abstand zueinander angeordnet. Ich möchte eine Art Grid erstellen, jedes einzelne soll dann später angeklickt werden. Habe die getPreferredSize Methode überschrieben, damit die Komponente die Größe dem Layoutmanager mitteilt. Aber es funktioniert nicht wie gewünscht. Hat einer vielleicht eine Idee. Vielen Dank im Voraus.


PS. Außerdem scheinen die Komponenten größer zu sein. Auch außerhalb der gezeichneten Quadrate wird eine ID ausgegeben, wenn ich einen MouseListener hinzufüge. Als ober-und unterhalb des jeweiligen Feldes.
Java:
public class Tile extends JComponent{
	
	private Rectangle bounds;
	private int id;
	
	public Tile(int id){
		bounds = new Rectangle(0,0,50,50);
		this.id = id;
		
		addMouseListener(new MouseInput());
	}

	protected void paintComponent(Graphics g){
		
		final Dimension DIM = getPreferredSize();
		
		g.setColor(Color.black);
		g.drawRect(bounds.x, bounds.y, DIM.width, DIM.height);
	}
	
	public Dimension getPreferredSize(){
		return new Dimension(bounds.width, bounds.height);
	}
	
	public Dimension getMinimumSize(){
		return getPreferredSize();
	}
	
	private class MouseInput extends MouseAdapter{
		public void mousePressed(MouseEvent e){
			System.out.println(id);
		}
		
	}
	

}

}




Java:
public class View extends JFrame {
	
	public View(){
		super("Grid");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setLocationRelativeTo(null);
		
		JPanel content = new JPanel(new GridLayout(2,2));
		
		
		for(int i=0; i<20; ++i){
				content.add(new Tile(i));
		}
	
	
		
		add(content);
		setVisible(true);
	}
 
Zuletzt bearbeitet:

Enceladus271

Bekanntes Mitglied
1. Wenn du ein GridLayout mit 2 Zeilen und 2 Spalten verwendest (new GridLayout(2,2)) hast du halt keinen Platz für 20 Komponenten.
2. Beim GridLayout sind alle Komponenten gleich groß. Und die Größe wird allein durch die Anzahl der Komponenten und den zur Verfügung stehenden Platz ermittelt. Das heißt das die eigentliche Größe der Komponenten (z.B. die Preferred Size) nicht berücksichtigt wird.

=> Du brauchst GridBagLayout oder BoxLayout.
 

LatinFavourite

Bekanntes Mitglied
Vielen Dank schon einmal für diesen Tipp. Die beiden Layout scheinen aber äußerst kompliziert zu sein. :-( Ich werde einmal versuchen, es mithilfe eines der Layouts umzusetzen. Liebe Grüße
 

LatinFavourite

Bekanntes Mitglied
Hallo nochmals,

habe nun etwas mit dem GridBagLayout probiert, doch es wird lediglich ein Quadrat angezeigt, was ist nun falsch?
Danke für jegliche Hilfe?

Java:
public class View extends JFrame{
	
	public View(){
		super("GridBagLayout Test");
		setSize(800, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setLocationRelativeTo(null);
		setLayout(new BorderLayout());
		
		
		JPanel raster = new JPanel(new GridBagLayout());
		Tile[][] tiles = new Tile[20][20];
		GridBagConstraints c = new GridBagConstraints();
		Tile tile;
		
		for(int i=0; i<20; ++i){
			for(int j=0; j<20; ++j){
				c.gridx = i;
				c.gridy = j;
				tile = new Tile();
				raster.add(tile, c);
				tiles[i][j] = tile;
			}
		}
		
		add(raster, BorderLayout.CENTER);
		setVisible(true);
	}
	
	private class Tile extends JComponent{
		protected void paintComponent(Graphics g){
			g.fillRect(0, 0, 50, 50);
		}
		
		public Dimension getPreferredSize(){
			return new Dimension(50, 50);
		}
	}

}
 

Enceladus271

Bekanntes Mitglied
Die Fenstergröße 800x600 reicht nicht aus um alle 400 Tiles darzustellen. Du musst dort größere Werte nehmen.

Wenn man nicht immer selbst ausrechnen will wieviel Platz man braucht, kann man auch vor dem setVisible die Methode pack() aufrufen. Dadurch wird die Fenstergröße optimiert. Das setLocationRelativeTo sollte dann nach dem pack() aufgerufen werden:
Java:
pack();
setLocationRelativeTo( null );
setVisible( true );

Alternativ kannst du raster in eine JScrollPane legen:
Java:
add( new javax.swing.JScrollPane( raster ), BorderLayout.CENTER );
 

strußi

Top Contributor
hab mal bei deiner Class Tile das JComponent duch JPanel ersetzt; damit man auch sieht, dass es mehr als ein würfel ist, hab ich es bunt färben lassen^^
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class View extends JFrame{
 
    public View(){
        super("GridBagLayout Test");
        setLayout(new BorderLayout());

        JPanel raster = new JPanel(new GridBagLayout());
        Tile[][] tiles = new Tile[20][20];
        GridBagConstraints c = new GridBagConstraints();
        Tile tile;

        for(int i=0; i<tiles.length; i++){
            for(int j=0; j<tiles[ i].length; j++){
                c.gridx = i;
                c.gridy = j;
                tile = new Tile();
                raster.add( tile, c);
                
                tiles[i][j] = tile;
            }
        }

        add(raster, BorderLayout.CENTER);
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);

        setVisible(true);
    }

    private class Tile extends JPanel{
        @Override
        protected void paintComponent(Graphics gr){
            float[] hsb =new float[ 3];
            Random cRandom =new Random();
            int r = cRandom.nextInt(255);
            int g = cRandom.nextInt(255);
            int b = cRandom.nextInt(255);
            Color.RGBtoHSB(r, g, b, hsb);
            gr.setColor( Color.getHSBColor(hsb[ 0], hsb[ 1], hsb[ 2]));
            gr.fillRect(0, 0, 50, 50);
        }

        @Override
        public Dimension getPreferredSize(){
            return new Dimension(50, 50);
        }
    }


    public static void main( String[] args){
        View v =new View();
    }
}
 

LatinFavourite

Bekanntes Mitglied
Vielen Dank euch beiden.

@Enceladus271 das mit der pack() Anweisung funktioniert, dann erscheint jedoch ein großes schwarzes Feld, das das gesamte Fenster ausfüllt. Habe nun noch Linen hinzugefügt mit.

Java:
 setBorder(new LineBorder(Color.white));

@strußi Danke, das ist ja schon einmal hilfreich. :)

Danke.
 
Zuletzt bearbeitet:

LatinFavourite

Bekanntes Mitglied
Eine kleiner Frage habe ich noch, welches Layout biete sich am besten an, wenn auf der linken Seite einige Elemente zur Bedienung angezeigt werden soll. Beim Borderlayout.WEST werden die Elemente zwar links aber mittig dargestellt. Soll ich für das Fenster dann lieber ein GridLayout wählen? Lieben Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
S Swing Schwierigkeiten mit JComponent AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben