עבור לתוכן

ציור ב- Java, אני די Noob

Featured Replies

פורסם

הי כולם.

אני מנסה לנסות לצייר כל מני דברים ב- Java. חשבתי על להתחיל עם קווים פשוטים קודם, אבל גם עם זה אני נתקל בבעיות.

כל ה- Java שאני יודע זה משנת לימודים אחת בבצפר (2 יחידות) אז אני לא יודע הרבה, רק את הבסיס.

בכל מקרה, התחלתי לחפש כל מני ספריות שתומכות בגרפיקה, מצאתי את שני אלו

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Graphics.html

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/geom/package-summary.html

מביניהם נראה לי ש Graphics תתאים לי יותר מ- Geometry מכיוון שב- Geometry לא נראה שממש אפשר לצייר את הקווים.

הבעיה היא שאני לא מבין איך להשתמש בספריה Graphics.

אני לא רואה ממש איזה Constructor שאני יכול להתמש בו ולכן אני לא יכול להתחיל להשתמש בפקודות שלה.

אשמח עם תוכלו להסביר לי איך אני יכול לקבל גישה לפעולות של הספריה Graphics.

תודה!

  • תגובות 30
  • צפיות 6.7k
  • נוצר
  • תגובה אחרונה
פורסם

קודם כל, צריך להיות לך JPANEL(תשתמש בSWING). תדרוס לJPANEL הזה את המתודה paint. המתודה הזו מקבלת משתנה מסוג Graphics שבעזרתו אתה יכול לצייר.


class MyPanel extends JPanel
{
...
public void paint(Graphics g)
{
g.drawLine(...)
}

...

}


פורסם
  • מחבר

קודם כל תודה רבה! עכשיו אני קצת מתחיל להבין את זה, אבל יש רק עוד בעיה אחת.

איזה מן עצם זה Graphics? איך אני יוצר אותו?

זה למשל מה שניסיתי לעשות בתוכנית הראשית

mypanel p=new mypanel();

Graphics g;

g.create(3, 5, 20, 30);

p.paint(g);

וזה mypanel

public class mypanel extends JPanel

{

public void paint (Graphics g)

{

g.drawLine(1, 2, 3, 3);

}

}

כמובן ש

import javax.swing.JPanel;

import java.awt.Graphics;

נמצאים בשניהם.

הוא כותב לי עכשיו

the local variable g may not have been initialized.

השאלה היא איך אני יוצר עצם מסוג Graphics או משתמש בעצם מסוג Graphics.

סליחה על השאלות הנוביות ותודה על העזרה!

פורסם

זה בכלל יוצר לך חלון כלשהו?

נראה לי שלפני JPanel אתה חייב שיהיה לך JFrame

אתה מסתכל על API ישן אגב.. הנה המעודכן:

http://java.sun.com/j2se/1.5.0/docs/api/

לצורך ציור קווים חופשי אתה יכול להתסכל על Canvas:

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Canvas.html

הנה קובץ לדוגמא:

/*
* HelloWorldSwing.java is a 1.4 example that
* requires no other files.
*/
import javax.swing.*;

import java.awt.*;
import java.awt.event.*; //for events

public class CanvasGUI {

public static void main(String[] args) {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//creating the buttons panel
JPanel panel1 = new JPanel(new FlowLayout());
panel1.add(new JButton("JButton"));
panel1.add(new JButton("JButton"));

JPanel canvas = new Canvas();

//adding a panel and a label
JPanel panel2 = new JPanel(new BorderLayout());
panel2.add(panel1,BorderLayout.NORTH);
panel2.add(canvas,BorderLayout.CENTER);


//set window to feet componants
frame.add(panel2);
frame.setSize(200,200);
frame.setVisible(true);
canvas.setBorder(BorderFactory.createTitledBorder("canvas"));
Canvas._gr = canvas.getGraphics();
}
}

@SuppressWarnings("serial")
class Canvas extends JPanel{
static Graphics _gr;
public Canvas(){
setSize(200,200);
addMouseMotionListener(new MouseMotionListner1());
}
}

class MouseMotionListner1 extends MouseMotionAdapter{
public void mouseDragged(MouseEvent e){
int x= e.getX(), y=e.getY();
Canvas._gr.drawLine(x,y,x,y);
}
}

פורסם

אתה צריך לקרוא פשוט לREPAINT, לא לPAINT.

אתה צריך לעשות

mypanel.repaint();

המערכת כבר תדאג לצייר את הצורות שלך שיהייה לה זמן. היא אפילו תדאג לשלוח לך GRAPHICS לPAINT.

פורסם
  • מחבר

Buffer תודה רבה על הקוד, אבל אני לא מחפש חלון שאפשר לצייר בו. אני מחפש פשוט חלון שהמחשב יצייר בו דברים לפי נתונים.

UnsignedInteger, נראה לי ששחכתם שאני Noob :P

לפי מה שאמרת זה מה שצריך להיות לי בתוכנית הראשית (בעצם במצב כזה אין לי תת-תוכנית של מחלקה ושום תת תוכנית אחרת כי אני לא צריך לעשות OverRiding לשום פעולה. לכן אני יכול פשוט להשתמש לפי מה שאמרת ב- repaint() של JPanel.


import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class test {

/**
* @param args
*/
public static void main(String[] args)
{

JPanel p=new JPanel();
JFrame frame=new JFrame("Hi");
p.repaint(3, 5, 10, 20);


}

}
import java.awt.geom.*;

זה לא מצייר לי כלום.

פורסם

לREPAINT לא שולחים פרמטרים.

ואתה חייב לדרוס את PAINT ובתוך PAINT להגיד לו מה לצייר(קווים, עיגולים וכו).

נניח שמה שעשית זה בסדר(וזה לא). איפה אתה אומר לו לצייר קו?

מדוגמא הכי פשוט ללמוד:





import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Draw extends JFrame{
public Draw(){
super("drawing demo");
setSize(330,330);
setVisible(true);
}
public void paint(Graphics g){
for(int i=0; i<25; i++){
g.setColor(new Color(i*10, 0, i*10));
g.drawRect(10+i*5, 20+i*5, 50+i*5, 50+i*5);
}
}
public static void main(String[] args){
Draw win=new Draw();
win.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
}

פורסם
  • מחבר

חחח חשבתי שמשהו שם לא הגיוני

תוכנית ראשית -


{
mypanel p=new mypanel();
JFrame frame=new JFrame("Hi");
p.repaint();
public static void main(String[] args) 

mypanel


{

public void paint(Graphics g)
{
g.drawLine(1, 2, 6, 4);
}
}
public class mypanel extends JPanel

למה הוא לא עושה כלום עכשיו?

פורסם

אתה צריך להוסיף את הPANEL שלך לFRAME.

frame.getContentpane().add(p, BorderLayout.Center);

יכול להיות שהתבלבלתי בשמות של הפונקציות, אך העיקרון הוא החשוב.

פורסם
  • מחבר

השורה שלך קצת התבלבלה בגלל הימין-שמאל פה.

בכל מקרה ניסיתי להבין מה כתבת שם אבל לא עבד לי ה-

(p, BorderLayout.Center)

אז השארתי רק את ה- p בפנים. יצא לי ככה ועדיין הוא לא עושה כלום.


{
mypanel p=new mypanel();
JFrame frame=new JFrame("Hi");
frame.getContentPane().add(p);
p.repaint();
public static void main(String[] args) 

תודה!

פורסם

נסה להוסיף בסוף את השורות הבאות:

frame.pack();
frame.setVisible(true);

פורסם
  • מחבר

עובד, תודה רבה! :D

אפילו בלי p.repaint();

מה השורה

Pack עושה?

אני רואה שהיא פותחת קצת את החלון בשבילי. בשביל מה? יש לה עוד תפקיד?

למה אני לא צריך את Repaint()?

פורסם

repaint אמור לעדכן את הפאנל או משהו כזה..

Pack מכין את ה- Frame לתצוגה על המסך.

אף פעם לא יצא לי להשתמש ב-repaint אז אני לא ממש יודע

פורסם

REPAINT אומר לJVM לצייר מחדש את הFRAME כמה שיותר מהר. בחלק מהמערכת הJVM לא מצייר את החלון כל פעם מחדש כדי לא להכביד על המחשב. הרעיון הוא להגיד לJVM מתי אתה רוצה שהוא יצייר מחדש את החלון.

אצלי למשל, החלון מצייר את עצמו מחדש כאשר מגדילים או מקטינים את החלון. בכל שאר הפעמים זה יכול ליצור בעיות.

אם אתה נתקע בבעיות שאתה שם לב שדברים לא פועלים כפי שהם צריכים לפעול, תנסה לדחוף במקום כלשהו REPAINT. זה צריך לפתור את הבעיה.

תנסה ליצור כפתור שמצייר משהו לPANEL.

פורסם
  • מחבר

סבבה, ממש תודה! עזרתם לי מאוד!

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים