Gå til innhold

GridBagLayout fyll horisontalt og vertikalt


Anbefalte innlegg

Skrevet

Hei. Har en JFrame som bruker GridBagLayout, men får den ikke helt til å vise seg frem slik jeg vil. Jeg har to tekstfelt som er lagt inn i vær sin JScrollPane. Den nederste skal ha høyde 40 (c.ipady = 40;), men den andre som er øverst vil jeg at skal fylle resten av plassen. Man har jo det som heter fill.VERTICAL, men jeg vil at den skal fylle både horisontalt og vertikalt. Her er i hvertfall koden min:

 

import javax.swing.*;
import java.awt.*;

class GUI extends JFrame {

   JEditorPane editor = new JEditorPane();
   JScrollPane editorScroll = new JScrollPane(editor);

   JTextArea text = new JTextArea();
   JScrollPane textScroll = new JScrollPane(text);

   GUI() {

setTitle("GridBag GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 0.5;
c.weighty = 0.5;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.PAGE_START;

add(editorScroll, c);

c.gridy = 1;
c.anchor = GridBagConstraints.PAGE_END;
c.ipady = 40;

add(textScroll, c);

setVisible(true);

   }

}

public class Run {

   public static void main(String[] args) {
new GUI();
   }

}

 

Noen som vet hvordan dette gjøres?

Videoannonse
Annonse
Skrevet

Hva med heller å bruke en BorderLayout og plassere den som skal ta 40px i BorderLayout.NORTH og den andre i BorderLayout.CENTER?

 

Jeg har dårlige erfaringer med GridbagLayout på det området der, men har ikke brukt den så mye.

Skrevet

Ja, jeg kan jo gjøre det. Men mener du å legge f.eks. en JPanel i BorderLayout.SOUTH som har GridBagLayout, slik at jeg kan sette høyden til 40?

Skrevet (endret)
import javax.swing.*;
import java.awt.*;

class GUI extends JFrame {

JEditorPane editor = new JEditorPane();
JScrollPane editorScroll = new JScrollPane(editor);

JTextArea text = new JTextArea();
JScrollPane textScroll = new JScrollPane(text);

GUI() {

	setTitle("GridBag GUI");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(400, 400);
	setLayout(new BorderLayout());

	add(editorScroll, BorderLayout.CENTER);
	add(textScroll, BorderLayout.NORTH);
	textScroll.setPreferredSize(new Dimension(400, 40));

	setVisible(true);

 }

}

public class Run {
public static void main(String[] args) {
	new GUI();
}
}

Har ikke testet koden, så den kompilerer sikkert ikke, men håper du tar tegningen ...

Endret av pgdx
Skrevet

Ja ok, skjønner! Eneste problemet der er at når jeg utvider guiet vil ikke det nederste tekstområdet utvide seg :ermm: Men jeg finner vel ut av det. Takk for hjelpen!

Skrevet

Utvider GUI-et? Når du minsker det til mindre enn 400 x 40 (i høyden) vil området i center forsvinne, ja, men det er vel en trade-off du må akseptere når du vil ha et område til alltid å være 40px høyt.

Skrevet

Bedret koden litt

package no.kjey.insert.package.name;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class BorderLayoutTesting extends JFrame {
private static final long serialVersionUID = 42L;
private JEditorPane editor;
private JScrollPane editorScroll;
private JTextArea text;
private JScrollPane textScroll;

public BorderLayoutTesting() {
	initialize();
}

private void initialize() {
	editor = new JEditorPane();
	editorScroll = new JScrollPane(editor);
	text = new JTextArea();
	textScroll = new JScrollPane(text);
	setTitle("BorderLayout-GUI");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(400, 400);
	setLayout(new BorderLayout());
	add(editorScroll, BorderLayout.CENTER);
	add(textScroll, BorderLayout.NORTH);
	textScroll.setPreferredSize(new Dimension(400, 40));
	setVisible(true);
}

public static void main(String[] args) {
	new BorderLayoutTesting();
}
}

Skrevet

Hvis du bruker new JTextArea(int antallLinjerSomSkalVises (2?), int minstAntallTegnSomSkalVises) slepper du pikselperfeksjonering, og ofte er det ønskerlig bare å vise hele linjer, ikke deler av neste/forrige linje også. Legg den sør i BorderLayouten, så vil den overstyre minstAntallTegnSomSkalVises og fylle bredden. Det vil den også gjøre dersom du resizer vinduet.

 

For å få JTextArea til å ikke bare skrive bortover kan du bruke <obj>.setLineWrap(true) (resultatet ligner da på å bruke JEditorPane), og <obj>.setWrapStyleWord(true) vil gjøre at ord ikke deles midt i ved linjeslutt.

  • 2 uker senere...
Skrevet

Hvis du vil at den skal strekke både i høyde og bredde, og skriver:

c.fill = GridBagConstraints.HORIZONTAL;

 

så fungerer det dårlig

 

c.fill = GridBagConstraints.BOTH;

 

fungerer litt bedre ;)

 

http://java.sun.com/j2se/1.4.2/docs/api/ja...onstraints.html

 

Hvis du skal rote rundt med GridBagLayout anbefaler jeg JBuilder 8 eller noe tilsvarende.. Oki da, sikkert ubrukelig pga dårlig JDK støtte, men de eldre versjonene av JBuilder hadde en svært god GUI builder, de nyere versjonene er fulle av bugs ;)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...