Avatar billede madox_madox Nybegynder
26. september 2003 - 18:33 Der er 8 kommentarer og
3 løsninger

Placere et Jpanel oven på et andet Jpanel. Hvordan?

Jeg har et Jpanel (JP1) som fylder hele min JFrame. Oven på JP1 skal jeg så placere et nyt panel(JP2). Dette skal placeres således at der er ca 50 pixel ud til kanten af min frame hele vejen rundt. Kan dette lade sig gøre?
Avatar billede conrad Nybegynder
26. september 2003 - 18:35 #1
ja, der er mange måder
1) brug setBounds til at placere dit panel
Avatar billede conrad Nybegynder
26. september 2003 - 18:37 #2
eller 2)benyt et layout fx borderlayout
http://java.sun.com/docs/books/tutorial/uiswing/layout/border.html
og fyld ud med panels i siderne og foroven og neden
Avatar billede conrad Nybegynder
26. september 2003 - 18:40 #3
eller 3) snyd og sæt en border på 50 pixels på dit panel jp1, så det ser ud som om du har en ramme omkring et panel
Avatar billede madox_madox Nybegynder
26. september 2003 - 19:19 #4
Kan desværre ikke få det til at virke. Har forsøgt med flg:
this.setBounds(50,50,580,480);
men den laver ikke noget om. Hvad gør jeg forkert
Avatar billede conrad Nybegynder
26. september 2003 - 19:46 #5
her er et lille eksempel som du kan rode lidt med

import javax.swing.*;
import java.awt.Color;
public class MyFrame extends JFrame
{

    JPanel p1,p2;

    public MyFrame()
    {
        super("Panel test");
        setSize(500,500);
        p1 = new JPanel();
        p1.setSize(getWidth(),getHeight());//same as frame
        p1.setBackground(Color.red);
        p1.setLayout(null);//It is not recommended to run without a layout manager
        p2= new JPanel();
        p2.setSize(p1.getWidth()-10,p1.getHeight()-10);//same as p1-50
        p2.setBackground(Color.green);
        p1.add(p2);
        p2.setLocation(5,5);
       
        getContentPane().add(p1);
        setVisible(true);   
       
   
    }

    public static void main(String args[])
    {
        MyFrame f = new MyFrame();   
    }

}
Avatar billede conrad Nybegynder
26. september 2003 - 19:46 #6
Jeg vil dog anbefale dig at bruge løsning 2 med et borderlayout da det bliver
meget nemmere at styre i længden
Avatar billede _carsten Nybegynder
26. september 2003 - 22:06 #7
Der er kun en måde at gøre det på, men har du overhovedet behov for panel JP1,
når du smider et JP2 ovenpå ???

Hvis du ikke bruger JP1 til noget, skal du istedet override getInsets()
i din JFrame, vil du der imod have JP1 og JP2 så lav en klasse som
extender JPanel og brug denne som JP1 (har kaldt den MyPanel her)

// KLASSEN SOM GØR DET HELE SÅ NEMT, UANSET HVILKEN STØRRELSE
// DIN FRAME HAR VIL JP2(MyPanel) ALTID VÆRE 50 PIXELS FRA KANTEN
// AF DIN FRAME
public class MyPanel extends javax.swing.JPanel {
    public MyPanel() {
        super();
    }
   
    public java.awt.Insets getInsets(){
        return new java.awt.Insets(50,50,50,50);
    }
}


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

public class MyFrame extends JFrame {
    private JPanel jPanel1;
    private MyPanel myPanel;    // klassen som extender JPanel
   
    public MyFrame() {
        initComponents();
        setSize(400,400);
    }
   
    private void initComponents() {
        myPanel = new MyPanel();
        jPanel1 = new JPanel();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        myPanel.setLayout(new BorderLayout());

        jPanel1.setBackground(new Color(255, 255, 0));
        myPanel1.add(jPanel, BorderLayout.CENTER);

        getContentPane().add(myPanel, BorderLayout.CENTER);

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new MyFrame().show();
    }
}
Avatar billede _carsten Nybegynder
26. september 2003 - 22:14 #8
Hov jeg har lige en lille bøf her....

Ret:    myPanel1.add(jPanel, BorderLayout.CENTER);
Til:    myPanel.add(jPanel1, BorderLayout.CENTER);
Avatar billede zacban Nybegynder
29. september 2003 - 10:52 #9
Det du gør forkert er at når du ikke vælger en layoutmanager med SetLayout() så vil den som default vælge FlowLayout. og SetBounds() virker kun hvis du sætter dit layout til Null... altså .SetLayout(null)

Husk at gøre det med både ContentPane() og med dit første panel... så er det bare et spørgsmål om at regne ud hvilke værdier du skal bruge for at det kommer til at passe
Avatar billede _carsten Nybegynder
29. september 2003 - 16:44 #10
>> zacban

Hvorfor begynde at regne på noget som ikke er nødvendigt ?

Metoden getInsets() er der til det samme og virker uanset
hvilken LayoutManager der er valgt.
Avatar billede _carsten Nybegynder
02. december 2003 - 20:25 #11
Oprydningstid ?????????
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