Avatar billede jarret Nybegynder
04. maj 2005 - 16:42 Der er 23 kommentarer og
2 løsninger

Hvordan påvirker jeg et "root" objekt?

Jeg har en applikation der indeholder en række JPanels. Enkelt af disse indeholder andre JPanels der indeholder buttons.

Hvordan påvirker jeg den omkringværende JFrame eller de "overordnede" fra de "inderste JPanels knapper" feks. at repainte JFramen.
Avatar billede kalp Novice
04. maj 2005 - 16:43 #1
Du får fat i JFrame med

this

burde vel ikke være noget problem hvilken knap du prøver at repainte med
Avatar billede jarret Nybegynder
04. maj 2005 - 16:46 #2
JPanelerne er oprettet fra forskellige klasser. Så det kan jeg ikke
Avatar billede kalp Novice
04. maj 2005 - 16:48 #3
så skal de klasser have en reference til JFrame når de initialiseres.. kan være via. konstruktøren.. eller ?
Avatar billede jarret Nybegynder
04. maj 2005 - 16:52 #4
hvordan gør jeg det-
jeg ahr prøvet noget ligende men kunne ikke få det til at virke
Avatar billede jarret Nybegynder
04. maj 2005 - 16:54 #5
måske skulle jeg smide det hele i en stor klasse..?

jeg har bare prøvet at dele det op for at få GUI klasser og kontroler klasser..
Avatar billede kalp Novice
04. maj 2005 - 16:56 #6
I din konstruktør til en af dine klasser som opretter et JPanel skal du lige have en JFrame parameter med... og til at gemme denne skal du lige oprette en JFrame objekt reference.

Ved attributterne.

private JFrame jFrame;

public klasseNavn(JFrame jFrame)
{
this.jFrame = jFrame;
}

når du så opretter denne klasse fra din orginale JFrame klasse siger du

etellerandet = new klasseNavn(this);
Avatar billede kalp Novice
04. maj 2005 - 16:58 #7
For at et objekt skal kunne pille ved et andet skal det have en reference til det...

Et objekt som opretter et andet objekt (fx. JFrame som opretter en af dine klasser)
kan selvfølgelig ændre alt ved denne klasse... men klassen kender IKKE JFrame objektet og kan derfor ikke pille ved det medmindre du gør som beskrevet før.. lader JFrame sende sig selv med over i konstruktøren på det objekt den opretter:)

dvs. så kender de hinanden og begge kan pille ved hinandens metoder.
Avatar billede jarret Nybegynder
04. maj 2005 - 17:00 #8
hvad så hvis jeg(hvilket jeg også skal) vil setVisible(false); til et JPanel, kan jeg det når jeg har JFramen med?
Avatar billede jarret Nybegynder
04. maj 2005 - 17:01 #9
ok så jeg skal også sende panelerne med
Avatar billede kalp Novice
04. maj 2005 - 17:02 #10
Det kan du godt...

Hvis du kan sige setVisible(false); fra din JFrame.. ved at kalde den metode i det objekt den har oprettet.. og objektet kan selvfølgelig også selv kalde den metode i sig selv.:)
Avatar billede jarret Nybegynder
04. maj 2005 - 17:02 #11
(hvis jeg i et af de underliggende paneler vil påvirke et af overordnede)
Avatar billede kalp Novice
04. maj 2005 - 17:02 #12
Jeg ved ikke helt hvordan du sætter dine paneler ind i din JFrame, men hvis ikke det er nok med objektet som opretter dem skal du sende dem med ja.
Avatar billede jarret Nybegynder
04. maj 2005 - 17:06 #13
ok jeg prøver - tak for hjælpen så langt (0:

lægger du et svar?
Avatar billede arne_v Ekspert
04. maj 2005 - 17:06 #14
Der er en getParent() metode i alle komponenter inkl. JPanel som man kan bruge
til at gå tilbage med.

Eksempel:

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

public class Parent extends JFrame {
    private String s;

    private JPanel p;

    public Parent() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        s = "Noget data";
        p = new MyPanel();
        getContentPane().add(p);
    }
   
    public String getS() {
        return s;
    }

    public static void main(String[] args) {
        Parent f = new Parent();
        f.setVisible(true);
    }
}

class MyPanel extends JPanel implements ActionListener {
    private JButton btn;
    public MyPanel() {
        super();
        btn = new JButton("Test");
        btn.addActionListener(this);
        add(btn);
    }
    public void actionPerformed(ActionEvent evt) {
        Parent p = (Parent)getParent().getParent().getParent().getParent();
        JOptionPane.showMessageDialog(this, p.getS());
    }
}
Avatar billede kalp Novice
04. maj 2005 - 17:11 #15
Det ligger jeg her:)

Kom også til at tænke på hvis dine JPanels ikke er erklæret private i dine klasser s kan man tilgå direkte blot ved at have initialiseret den klasse som opretter dem..
Avatar billede kalp Novice
04. maj 2005 - 17:13 #16
bliver nød til at smutte i en times tid så kommentere evt. spørgsmål (hvis ikke arne_v gør det) når jeg vender tilbage.
Avatar billede jarret Nybegynder
04. maj 2005 - 17:49 #17
super jeg har fået det til at virke (din løsning arne)
Avatar billede jarret Nybegynder
04. maj 2005 - 17:53 #18
når jeg nu er kommet til tilstrekkeligt langt tilbage og gjort Panel usynligt, kan jeg så sætte et andet panel der ligger i samme objekt synlige? Hvis jeg getParent´er en gang til får jeg vel det objekt mit "objekt" ligger i men kan jeg herfra kalde et andet objekt der ligger i samme objekt......hvis det ellers giver mening
Avatar billede jarret Nybegynder
04. maj 2005 - 17:55 #19
PanelStart p = (PanelStart)getParent();
               
                p.setVisible(false);
               
               
                PanelStart p = (PanelStart)getParent().getParent();
               
                p.detandetobjekt.setVisible(true);
Avatar billede jarret Nybegynder
04. maj 2005 - 17:58 #20
PanelStart y = (PanelStart)getParent();
               
y.setVisible(false);               
               
PanelStart x = (PanelStart)getParent().getParent();
               
x.detandetobjekt.setVisible(true);
Avatar billede arne_v Ekspert
04. maj 2005 - 18:07 #21
Alle containere har en .getComponents() som returnerer de komponenter som de indeholder
Avatar billede kalp Novice
04. maj 2005 - 19:14 #22
jarret >> Jeg ved ikke helt om det svare til, at man gør en JFrame til setVisible(false); og så prøver at gøre nogle komponter på den til setVisible(true);

De er synlige i JFramen'en men da den er ikke er synlig for dig kan du alligevel ikke se dem.

men ved ikke om det gælder for JPanels for de ligger trods alt i en JFrame så man kan under alle omstændigheder se en brugergrænseflade.

så det kode du har pasted for oven hvis det er en kode som viser det er muligt så er det bare godt nok:)
Avatar billede _carsten Nybegynder
04. maj 2005 - 21:46 #23
Det lyder som om du er på vej ud i noget snavs, med en masse referencer i ydre/indre paneler som vises skjules, det ender i hø, prøv at studere en af nedenstående løsninger

LØSNING 1.

import java.awt.*;
public class TestCardLayout extends javax.swing.JFrame {
   
    public TestCardLayout() {
        initComponents();
        setSize(400,400);
    }
   

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jPanel3 = new javax.swing.JPanel();
        jPanel4 = new javax.swing.JPanel();
        jPanel5 = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();

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

        jLabel1.setText("I dette panel er en masse knapper og tekstfelter");
        jPanel1.add(jLabel1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

        jPanel2.setLayout(new java.awt.CardLayout());

        jPanel3.setBackground(new java.awt.Color(0, 102, 255));
        jPanel2.add(jPanel3, "card2");

        jPanel4.setBackground(new java.awt.Color(255, 0, 51));
        jPanel2.add(jPanel4, "card3");

        jPanel5.setBackground(new java.awt.Color(51, 153, 0));
        jPanel2.add(jPanel5, "card4");

        getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        jMenu1.setText("Menu");
        jMenuItem1.setText("Vis bl\u00e5t panel");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action1(evt);
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("Vis r\u00f8dt panel");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action2(evt);
            }
        });

        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("Vis gr\u00f8nt panel");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action3(evt);
            }
        });

        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    private void action1(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card2");
    }

    private void action2(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card3");
    }

    private void action3(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card4");
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new TestCardLayout().show();
    }
   

    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;   
}






LØSNING 2. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

public class Test3 extends JFrame {
    public Test3() {
        initComponents();
        setSize(400,400);
    }


    private void initComponents() {
        jPanel1 = new JPanel();
        jButton1 = new JButton();
        jPanel2 = new JPanel();
        jButton2 = new JButton();

        getContentPane().setLayout(new CardLayout());


        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setBackground(new Color(51, 102, 255));
        jButton1.setText("Vis panel 2");
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                movePanel(evt);
            }
        });

        jPanel1.add(jButton1);

        getContentPane().add(jPanel1, "card1");

        jPanel2.setBackground(new Color(51, 255, 51));
        jButton2.setText("Vis panel 1");
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                movePanel(evt);
            }
        });

        jPanel2.add(jButton2);

        getContentPane().add(jPanel2, "card2");
    }

    private void movePanel(ActionEvent evt) {
    CardLayout cl = (CardLayout)this.getContentPane().getLayout();
        cl.next(this.getContentPane());
    }

    private void exitForm(WindowEvent evt) {
        System.exit(0);
    }


    public static void main(String args[]) {
        new Test3().show();
    }

    private JButton jButton1;
    private JButton jButton2;
    private JPanel jPanel1;
    private JPanel jPanel2;
}
Avatar billede jarret Nybegynder
06. maj 2005 - 12:16 #24
nå, - jeg har fundet en kombineret løsning - så jeg stemmer for en deler
Avatar billede arne_v Ekspert
06. maj 2005 - 13:18 #25
så vil jeg ligge et svar
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