Avatar billede top Nybegynder
01. juni 2001 - 16:50 Der er 12 kommentarer og
1 løsning

getGraphics();

Jeg forsøger at bruge getGraphics() til at give mig noget at tegne på, men jeg får \'null\' tilbage..

Jeg bruger den fra en klasse der arver fra JInterNalFrame, og har forsøgt forskelligt (fx. getContentPane().getGraphics() og at oprette en ny canvas og prøve på den), men uden held..

:-??
Avatar billede mpultz Nybegynder
01. juni 2001 - 17:02 #1
Hvis du vil overskrive den måde en komponent bliver fremvist på så override paintComponent() metoden. F.eks.

public void paintComponent(Graphics g)
{
  Graphics2D g2d = (Graphics2D)g;
  // brug nu g2d
}

Hvis du bruger Java 1 override da paint() metoden i stedet, og her kan du så ikke konvertere Graphics objektet, da Graphics2D er en Java 2 ting.
Avatar billede top Nybegynder
01. juni 2001 - 17:08 #2
jeg vil faktisk kunne vise et billede i et JInternalFrame, og samtidig have en \'pixelmatrix\' for at kunne lave threshold funktion mm.

(har kik på WriteabæeRaster..)
Avatar billede mpultz Nybegynder
01. juni 2001 - 17:13 #3
Grunden til at getGraphics() returnerer null er højst sandsynligt at din komponent ikke er synlig når du kalder metoden. Dette skal metoden også gøre iflg. API dokumentationen, hvis altså din komponent ikke er synlig.
Avatar billede mpultz Nybegynder
01. juni 2001 - 17:16 #4
Ang. dit JInternalFrame så vil jeg bruge ovenstående metode til at vise billede og pixelmatrix. Det er den typiske fremgangsmåde hvis man \"selv vil tegne\" på en komponent.
Avatar billede top Nybegynder
01. juni 2001 - 17:21 #5
ok jeg prøver lige om jeg kan få noget til at virke..

Avatar billede top Nybegynder
01. juni 2001 - 17:41 #6
hmm sådan da..

Du havde ret i at det var fordi det ikke var aktivt, så derfor pointene.. Der er flere hvis du kan hjælpe mig videre :-)

Jeg har somsagt en klasse dernedarver fra JInternalFrame (den hedder ImageFrame), der indeholder bl.a. :


    public ImageFrame(String fileName) {
        super(fileName, true, true, true, true); //resizeable, closeable, maximizeable, iconifiable
        setSize(300, 300);
        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
        openFrameCount++;

    }
   
    public void addImage(String fileName) {
        toolKit = Toolkit.getDefaultToolkit();
        image = toolKit.getImage(fileName);
        Graphics g = getContentPane().getGraphics();
        g.drawImage(image, 0, 0, 10, 10, this);
        g.drawLine(10,10,40,40);
    }

AddImage skulle være til at putte et billede ind i et JInternalFrame (efter det er oprettet), men det virker ikke. Der kommer ikke andet frem end rammen omkring JInternalFrame\'et :-?

Er det fordi jeg ikke laver framet rigtigt fra starten?
Avatar billede mpultz Nybegynder
01. juni 2001 - 18:40 #7
Prøve at erstat addImage med følgende:

Denne member variabel:

Image image = Toolkit.getDefaultToolkit().getImage(fileName);

Og override paintComponent() metoden:

public void paintComponent(Graphics g)
{
  super.paintComponent(g);
  g.drawImage(image, 0, 0, 10, 10, this);
  g.drawLine(10,10,40,40);
}

Så skulle den vidst være der.
Avatar billede mpultz Nybegynder
01. juni 2001 - 18:47 #8
Alternativ: Hvis du vil bevare din addImage metode skal du omskrive den. Brug getContentPane().add() metoden for at tilføje dit billede til dit frame. paintComponent, som du så ikke behøver at overloade, tegner så selv dit billede op. Du kan sætte billedets størrelse ekspicit eller lade en layout manager gøre det. Som din kode er nu bliver billedet aldrig tilføjet til dit frame. Du tegner rigtig nok billedet, men når paint metoderne bliver kaldt overskrives det.
Avatar billede top Nybegynder
02. juni 2001 - 14:37 #9
jeg har prøvet dit forslag 1, men uden held.

Dog opdagede jeg at når jeg adder mit ImageFrame til min jdesktop, har jeg gjort det direkte (jDesktopPane1.add(frame)), og ikke med getContentPane().add(frame);

Gjorde jeg det med getcontentPane er det som om billedet tegnes men overskrives af noget andet, og hvis jeg adder direkte, ser jeg aldrig noget?

Er det fordi mit Billede ikke bliver tegnet øverst (jeg tegner ikke længere en linie, det var bare for at se om jeg kunne få noget frem)?
Avatar billede mpultz Nybegynder
02. juni 2001 - 16:09 #10
Når du bruger Swing containere skal du bruge getContentPane().add() og ikke add().

Har du prøvet mit første forslag kombineret med getContentPane().add()?

Hvis ikke så er grunden til at du kun ser dit billede i et lille øjeblik, når du bruger getContentPane().add(), at paint metoden bliver kaldt automatisk og overskriver dit billede. Læg koden som tegner dit billede i paintComponent metoden (den bliver kaldt automatisk af paint metoden), som i mit første forslag. Så tegnes billedet hver gang paint metoden bliver kaldt (f.eks. efter en resize af vinduet etc.).
Avatar billede top Nybegynder
02. juni 2001 - 16:45 #11
ok jeg bruger getContentPane().add() fra nu af .-)

jeg har prøvet med getContentPane().add() og

public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }
   
    public void addImage(String fileName) {
        image = Toolkit.getDefaultToolkit().getImage(fileName);
        Graphics g = getContentPane().getGraphics();       
    }

og jeg har prøvet at have g.drawImage(image, 0, 0, this); sidst i addImage.
Hvilket er hvor jeg kan se billedet..

Desuden er mine JInternalFrames lidt underlige, jeg kan sætte ikke størrelsen på dem, uanset hvad jeg gør, og hvis jeg inde i ImageFrame klassen (nedarv af JInternalFrame) bruger setLocation(..) er det der biledet kommer frem, men ikke JInternalFrame\'et ?

Er det fordi getContentPane().getGraphics() returnerer min JDeskTop i stedet for JInternalFrame?
(ved en System.out.println(getContentPane()); får jeg et JFrame og noget mere..)


Avatar billede mpultz Nybegynder
02. juni 2001 - 22:14 #12
OK, jeg har leget lidt med JInternalFrame og jeg må give dig ret i at løsningen med at override paintComponent() ikke virker. Jeg tror det har noget med komponenten JInternalFrame natur at gøre, men her er i hvert fald to løsninger som virker.

Fælles for begge løsninger:

public class DrawImage extends JFrame {

  private JDesktopPane desktopPane = new JDesktopPane();

  public DrawImage() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
    desktopPane.setLayout(new FlowLayout());
    desktopPane.add(new MyInternalFrame());
    getContentPane().add(desktopPane, BorderLayout.CENTER);
  }

  public static void main(String[] args) {
    DrawImage drawImage1 = new DrawImage();
    drawImage1.setBounds(100, 100, 300, 300);
    drawImage1.setVisible(true);
  }
}

Løsning 1:

class MyInternalFrame extends JInternalFrame
{
  private Image myImage = Toolkit.getDefaultToolkit().getImage(\"test.jpg\");

  public MyInternalFrame()
  {
    super(\"MyInternalFrame\", true, true, true, true);
    getContentPane().add(new JLabel(new ImageIcon(myImage)));
    setPreferredSize(new Dimension(250, 250));
    setVisible(true);
  }
}

Løsning 2:

class MyInternalFrame extends JInternalFrame
{
  public MyInternalFrame()
  {
    super(\"MyInternalFrame\", true, true, true, true);
    getContentPane().add(new MyPanel());
    setPreferredSize(new Dimension(250, 250));
    setVisible(true);
  }
}

class MyPanel extends JPanel
{
  private Image myImage = Toolkit.getDefaultToolkit().getImage(\"test.jpg\");

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    g.drawImage(myImage, 0, 0, this);
  }
}
Avatar billede mpultz Nybegynder
02. juni 2001 - 22:22 #13
Et par kommentarer til begge løsninger.

Løsning 1 bruger en layout manager til at positionere billedet.

I løsning 2 bliver billedet tegnet op eksplicit i en overrided paintComponent. Det virker som sagt ikke hvis man bare overrider metoden i MyInternalFrame, men det gør det hvis klassen arver fra JPanel. Derfor er panellet lagt ind i MyInternalFrame.
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