14. juli 2003 - 11:52Der er
9 kommentarer og 1 løsning
Repaint i JFrame
Hej!
Jeg er i gang med at lave et skakspil, som jeg ønsker at repræsenterer grafisk. Dette har jeg forsøgt at gøre ved at have en klasse der arver fra JFrame, og som indeholder en paint metode.
Jeg har valgt at tegne mit skakbræt, ved at lave 64 kald til fillRect() metoden. Herefter foretager jeg kald til paintIcon() metoden, for at indsætte de forskellige brikker, som er repræsenteret vha. *.gif
Mit problem opstår, når brugeren skal foretage en handling(det skal siges at, det kun er tænkt som et to-player spil). Jeg har tilføjet en MouseListener til mit JFrame, så det er muligt for brugeren at klikke på skakbrættet, og kontrollerer også for, at der vælges områder inden for skakbrættets rammer. Men jeg er ikke i stand til at tegne noget nyt på brættet, som følge af en event. Jeg har som test forsøgt et tegne en cirkel, på baggund af en user-event, ved brug af metoden drawOval og repaint(), men det lykkedes ikke for mig.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Jeg tror ikke jeg helt forstår dit problem, så jeg har lavet et lille eksempel som tegner cirkler hver gang musen slippes, måske kan det hjælpe dig på vej.
public class Draw extends javax.swing.JFrame {
public Draw() { initComponents(); setSize(400,400); }
carsten, de eksempler jeg har arbejdet ud fra, har været opbygget anderledes. Her har klassen som extender JFrame overskrevet paint-metoden.
Din opbygning virker en del flottere end ovenstående. Jeg kan dog stadig ikke helt finde ud af at løse mit problem. Hvis nu man vil tegne et rektangel som baggrund, og så tegne cirkler ovenpå vha. musen hvordan gør man så det (med udgangspunkt i din klasse Draw)?? Har prøvet med drawRect() i starten af din metode initComponents, men modtager nullPoinerException
Jeg er tidsmæssigt lidt presset, så jeg modificeret mit tidligere eksempel lidt, skulle give dig en ide om hvordan det virker.
public class Draw extends javax.swing.JFrame {
public Draw() { initComponents(); setSize(400,400); }
private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jComboBox1 = new javax.swing.JComboBox();
Jeg får ikke udtrykt mig klart nok, men har stadig stor glæde af at se din kode.
Jeg vil gerne kunne tegne i en container-component, ligesom du har vist mig i dine eksempler. Men samtidig vil jeg også gerne have det sådan, at der allerede er tegnet noget i feltet i forvejen (altså før brugeren har forårsaget en event). Med udgangspunkt i dit første Draw-eksempel kunne det foreksempel være, at der blev tegnet et stort rektangel, hvorefter man så kunne tegne cirkler ved klik på musen.
Jeg ville da tro, at man skulle kalde drawRect i metoden initComponents, men kan ikke få dette til at virke
swing.JFrame {
public Draw() { initComponents(); setSize(400,400); }
} Håber at det giver lidt mere mening, ellers kan jeg prøve at præcisere yderligere. Vil meget gerne have hjælp, men jeg må opfordre til at du, prioterer mine spørgsmål lavere end din opgave. Vil meget gerne oprette et nyt spørgsmål, så du kan få flere point.
Det er rigtigt som du gør, du skal bare ændre lidt mere. Grunden til at det ikke virker er metoden: show();
Lav følgende ændringer:
public Draw() { initComponents(); setSize(400,400);
show(); // KALD SHOW() HER, JFRAMEN SKAL VISES FØREND DU KAN // BEGYNDE AT TEGNE PÅ DEN // HUSK AT FJERNE show() FRA DEN STATISKE METODE // public static void main(String args[]) { // new Draw(); SÅDAN // }
Du kan også kalde min: drawRect(java.awt.event.MouseEvent evt) Det er bare noget mere tricky, for den mangler en MouseEvent som metoden kræver som argument, den genereres ikke på det tidspunkt hvor din frame initieres, det problem kan løses ved at du så at sige selv genererer en mere eller mindre fiktiv MouseEvent, du kan ændre constructoren til nedenstående, hvilket har samme effekt - ovenstående løsning er bare nemmest.
public Draw() { initComponents(); setSize(400,400);
Har ikke haft adgang til net, og har derfor ikke fået sagt tak for hjælpen. Har nu fået mit program til at virke, ved brug af dine råd.
Tak for hjælpen!
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.