Avatar billede themepark Nybegynder
05. november 2005 - 16:27 Der er 12 kommentarer og
1 løsning

For lille vindue ved pack

Jeg har en JFrame med et GridLayout, hvor jeg tilføjer en masse JLabels og derefter kalder pack. I hver enkel JLabel har jeg en JTextField, hvori der står en enkel char.

Problemet er at når vinduet vises, er det overhovedet ikke resizet, hver label fylder ca. 5 pixels i højde og bredde. Jeg går ud fra at det har noget at gøre med JLabelens Layout (jeg bruger lige nu BorderLayout), og jeg har kigget på nogle andre Layouts, men har ikke kunnet finde noget der virker.

Jeg har også prøvet at sætte preferredSize på mine JLabels til at være lig med preferredSize på mine JTextFields, men det er ikke nok, det er kun det halve af tekstfelterne, der vises.

Så tja...nogle forslag til hvordan jeg kan få mit vindue resizet ordentligt og automatisk, altså uden at angive en bestemt højde eller bredde?
Avatar billede mikkelbm Nybegynder
05. november 2005 - 16:41 #1
Prøv at sætte både setMinimumSize og setPreferredSize
Avatar billede themepark Nybegynder
05. november 2005 - 17:26 #2
Det hjælper desværre ikke, tekstfelterne vises stadigvæk kun halvt :(
Avatar billede mikkelbm Nybegynder
05. november 2005 - 17:53 #3
Det burde nu være nok. Har du meget kode eller kan du poste det her?
Avatar billede themepark Nybegynder
05. november 2005 - 20:56 #4
Det er ikke nødvendigt, jeg fandt fejlen. Det var fordi jeg havde en Border rundt om hver label, derfor blev de forskubbet :)
Avatar billede themepark Nybegynder
05. november 2005 - 22:58 #5
Hmm, nu er jeg for hurtig, for det kan godt være at jeg har fundet fejlen men det hjælper fedt, når jeg rent faktisk skal have en Border på min JLabel.

Så mit problem er der stadig. Såvidt jeg kan se, går borderen ind over tekstfeltet, altså tager noget af dens plads, og dermed bliver noget af teksten overskygget.

Så jeg spekulerede på om der var en måde at få borderen talt med når jeg resizer, eller om jeg evt. i stedet for kan lave en border for mit GridLayout som omkranser alle min Components på alle sider.
Avatar billede mikkelbm Nybegynder
05. november 2005 - 23:18 #6
Igen skal jeg bruge noget kode for at se hvordan din gui er bygget op.

Er det en nødvendighed at kalde pack?
Avatar billede themepark Nybegynder
05. november 2005 - 23:48 #7
Et lille eksempel jeg har brygget sammen

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

public class Test extends JFrame {
    public Test() {
        Container c = getContentPane();
        c.setLayout(new BorderLayout());
        JPanel Board = new JPanel();
        Board.setLayout(new GridLayout(5, 5));
        for (short RowCounter = 0; RowCounter < 5; RowCounter++) {
            for (short ColumnCounter = 0; ColumnCounter < 5; ColumnCounter++) {
                JLabel Field = new JLabel();
                Field.setLayout(new BorderLayout());
                Field.add(new JTextField());
                ((JTextField) Field.getComponent(0)).setHorizontalAlignment(JTextField.CENTER);
                ((JTextField) Field.getComponent(0)).setOpaque(false);
                ((JTextField) Field.getComponent(0)).setBorder(null);
                Field.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                ((JTextField) Field.getComponent(0)).setEditable(false);
                ((JTextField) Field.getComponent(0)).setText("6");
                Field.setPreferredSize(((JTextField) Field.getComponent(0)).getPreferredSize());
                Board.add(Field);
            }
        }
        c.add(Board, BorderLayout.CENTER);
        c.add(new JButton("Nord"), BorderLayout.NORTH);
        c.add(new JButton("Vest"), BorderLayout.WEST);
        c.add(new JButton("Øst"), BorderLayout.EAST);
        c.add(new JButton("Syd"), BorderLayout.SOUTH);
        pack();
        setVisible(true);
    }
}

Tja, det er vel ikke nødvendigt, men det er vel klart det smarteste da den automatisk afgør størrelsen på vinduet.
Avatar billede mikkelbm Nybegynder
05. november 2005 - 23:56 #8
I det eksempel du har der, er det fordi dine textfields ikke har en preferredSize.

Prøv at ændre

Field.add(new JTextField());

til

Field.add(new JTextField(10));
Avatar billede mikkelbm Nybegynder
05. november 2005 - 23:58 #9
Så burde de få en størrelse.
Avatar billede mikkelbm Nybegynder
06. november 2005 - 00:24 #10
Og ikke fordi jeg skal blande mig i hvordan du koder, men jeg vil mene nedenstående er mere læsevenligt end dit :)

...
JLabel field = new JLabel();
field.setLayout(new BorderLayout());
JTextField textField = new JTextField (10);
field.add(textField);
textField.setHorizontalAlignment(JTextField.CENTER);
textField.setOpaque(false);
textField.setBorder(null);
field.setBorder(BorderFactory.createLineBorder(Color.BLACK));
textField.setEditable(false);
textField.setText("6");
field.setPreferredSize(textField.getPreferredSize());
Board.add(field);
...
Avatar billede themepark Nybegynder
06. november 2005 - 00:43 #11
He he, selvfølgelig har du ret, jeg burde også have rettet det, jeg ville bare ikke have den ekstra variabel i min oprindelige kode :)

Men problemet er at jeg gerne vil have felterne til at tilpasse deres størrelse præcis efter teksten, hvilket de sådan set også gør, men borderen (som SKAL være der), tager en bid af det :(
Avatar billede themepark Nybegynder
06. november 2005 - 00:54 #12
He he, du gav mig faktisk ideen til at få det til at virke. Jeg bruger tekstens længde til at sætte setColumns :) Smid et svar og tak for hjælpen :)
Avatar billede mikkelbm Nybegynder
06. november 2005 - 00:56 #13
Jamen det gør jeg så...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester