01. juni 2001 - 16:50Der 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..
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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.
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?
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.
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)?
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.).
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..)
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();
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.
Synes godt om
Ny brugerNybegynder
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.