Avatar billede alphaleader Nybegynder
25. maj 2004 - 21:57 Der er 17 kommentarer

Problemer med paint() metoden!!

Jeg har problemer med at få vist Labelen i nedenstående kode. Problemet opstod efter jeg implementerede paint() metoden:


public class EvaluationDialog extends JDialog {
  JPanel panel1 = new JPanel();
 
  public EvaluationDialog() {
    this.setResizable(false);
    panel1.setLayout(null);
    getContentPane().add(panel1);
    getContentPane().setLayout(null);
   
    javax.swing.JLabel evaluationLabel = new javax.swing.JLabel();
    evaluationLabel.setText("HEJ");
    evaluationLabel.setBounds(0,20,205,154);

    getContentPane().add(evaluationLabel);
    evaluationLabel.setVisible(true);
      }


public void paint(Graphics g){
        g.drawString("Speed", 480, 60);
        g.drawString("Distance", 740, 220);
}
}
Avatar billede mikkelbm Nybegynder
25. maj 2004 - 22:08 #1
Tilføj:

super.paintComponents(g); 

som det første i din paintmetode.
Avatar billede alphaleader Nybegynder
25. maj 2004 - 22:48 #2
Det virker kun hvis man hiver i vinduet. SÅ bliver labelen synlig (som om den repainter eller sådan noget). Men hvis man blot lader vinduet være idet det åbnes så kan man stadig ikke se labelen!
Avatar billede mikkelbm Nybegynder
25. maj 2004 - 22:51 #3
hvad hvis du kører en:

getContentPane().validate();

som det sidste i constructoren?
Avatar billede _carsten Nybegynder
26. maj 2004 - 08:00 #4
Sådan skal du lave den.

public void paint(Graphics g){
        super.paint(g);
        g.drawString("Speed", 480, 60);
        g.drawString("Distance", 740, 220);
}
Avatar billede alphaleader Nybegynder
26. maj 2004 - 10:15 #5
Det fungerer stadig ikke!

Det er først når man hiver lidt i vinduet så bliver labelen tegnet!
Avatar billede Slettet bruger
26. maj 2004 - 10:28 #6
hvad med at kalde updateUI() til sidst i constructoren ?
Avatar billede alphaleader Nybegynder
26. maj 2004 - 11:01 #7
Man kan ikke kalde updateUI() til sidste i constructoren

"cannot resolve symbol: method updateUI ()in class ...."
Avatar billede _carsten Nybegynder
26. maj 2004 - 11:06 #8
Har du overhovedet gjort dig den ulejlighed at prøve om super.paint(g); virkede ??

Ellers har du muligheden her !

import java.awt.Graphics;
import javax.swing.JDialog;
import javax.swing.JPanel;

/*
* Test.java
*
* Created on 26. maj 2004, 10:59
*/

/**
*
* @author  Administrator
*/
public class Test extends javax.swing.JFrame {
   
    /** Creates new form Test */
    public Test() {
        initComponents();
        EvaluationDialog d = new EvaluationDialog();
        d.setSize(800, 600);
        d.setVisible(true);
    }
   
    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    private void initComponents() {
       
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
       
        pack();
    }
   
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        new Test().show();
    }
   
    // Variables declaration - do not modify
    // End of variables declaration
   
}


class EvaluationDialog extends JDialog {
  JPanel panel1 = new JPanel();
 
  public EvaluationDialog() {
    this.setResizable(false);
    panel1.setLayout(null);
    getContentPane().add(panel1);
    getContentPane().setLayout(null);
   
    javax.swing.JLabel evaluationLabel = new javax.swing.JLabel();
    evaluationLabel.setText("HEJ");
    evaluationLabel.setBounds(0,20,205,154);

    getContentPane().add(evaluationLabel);
    evaluationLabel.setVisible(true);
      }


    public void paint(Graphics g){
        super.paint(g);
        g.drawString("Speed", 480, 60);
        g.drawString("Distance", 740, 220);
    }
}
Avatar billede alphaleader Nybegynder
26. maj 2004 - 11:08 #9
Ja... jeg har gjort mig den ulejlighed! Men det virker ikke :-S... desværre
Avatar billede snoop_one Nybegynder
23. januar 2005 - 23:12 #10
prøv at kalde pack() inden du sætter noget til at være visible.
Avatar billede snoop_one Nybegynder
23. januar 2005 - 23:27 #11
//Understående kode køre fint hos mig.. (Java SDK 1.5)

import java.awt.Graphics;
import javax.swing.JDialog;
import javax.swing.JPanel;

public class EvaluationDialog extends JDialog {
    JPanel panel1 = new JPanel();

    public EvaluationDialog() {
        this.setResizable(false);
        panel1.setLayout(null);
        getContentPane().add(panel1);
        getContentPane().setLayout(null);

        javax.swing.JLabel evaluationLabel = new javax.swing.JLabel();
        evaluationLabel.setText("HEJ");
        evaluationLabel.setBounds(0, 20, 205, 154);

        getContentPane().add(evaluationLabel);
        pack();
        evaluationLabel.setVisible(true);
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Speed", 480, 60);
        g.drawString("Distance", 740, 220);
    }

    public static void main(String[] args) {
        EvaluationDialog eval =new EvaluationDialog();
        eval.setSize(800,800);
        eval.setVisible(true);
       
    }
}
Avatar billede _carsten Nybegynder
23. januar 2005 - 23:45 #12
> snoop_one
Nu er det mere end et halvt år siden spørgsmålet blev stillet og det er vel næppe aktuelt mere, men hvad er det lige du mener dit eksempel gør i f.h.t mit - pack() løser jo intet i f.h.t problemet.
Avatar billede snoop_one Nybegynder
23. januar 2005 - 23:53 #13
hehe nej pack() løse ikke problemet... men forebygger mod fremtidige problemer.
Bare fordi man kun er bevidst om ét problem betyder det ikke, at man ikke har flere ;0)
Avatar billede _carsten Nybegynder
24. januar 2005 - 00:03 #14
men forebygger mod fremtidige problemer  ????

Betyder det at pack er lig en livslang penecillinkur  ???

Mig bekendt er den eneste forskel på pack og setVisible at pack beregner preferredSize, samt komponenter klargøres så de kan blive synlige hvorefter layoutet valideres.
Avatar billede _carsten Nybegynder
24. januar 2005 - 00:18 #15
For mig at se der kun et problem, nemlig at alphaleader adder et JPanel
    getContentPane().add(panel1);
hvor der måske tilføjes flere komponenter, eller der defineres en størrelse
som rækker ud over den label og så vil labellen ikke være synlig, den del
af koden har alphaleader MÅSKE klippet ud for overskuelighedens skyld, hvilket
vi jo ikke kan se.

Fakta er at begge vore eksempler virker, hvilket de også gerne skulle gøre.
Avatar billede snoop_one Nybegynder
24. januar 2005 - 00:47 #16
Jo det er rigtigt, men det er ikke en lille forskel. Der er mange studerende der glemmer pack() og kan ikke rigtig forstå hvorfor deres gui ikke er som de gerne vil have den til at være (selvom de har kaldt setVisible) - én god regl er at kalde pack efter alle ens componenter er added til ens vindue.

Jeg kan dog spotte nogle flere problemer, men det er nok mere personligt programmerings stil... (f.eks. ville jeg ikke sætte null som layoutmanager eller sætte en label til at være setVisible(true) inden setVisible(false) er kaldt - bare for at nævne nogle få stykker..)

Men jo de virker begge, og måske har alphaleader også fået det til at virke ;0)
Avatar billede _carsten Nybegynder
24. januar 2005 - 00:58 #17
Øhhhhh

1. Det skyldes manglende forståelse for de forskellige LayoutManager

2. Det er ikke nødvendigvis en forglemmelse at undlade et kald til pack()

3. Det er grundløst at kalde setVisible(true) eller setVisible(false) på en label,
    medmindre den skal være usynlig.

4. Hvis man vil bruge setBounds() til at positionere sine komponenter, SKAL
    LayoutManageren sættes til null.
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