ציור ב- Java, אני די Noob - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


X_Dror

Recommended Posts

בעיה חדשה שנתקלתי בה בקשר לקלט.

בעבר כשעוד למדתי Java בשביל הבגרות בבצפר היינו משתמשים בספריות קלט שכבר הכינו לנו בבצפר שהיו פשוטות יותר. עכשיו אני מנסה להשתמש בספריות הרגילות של Java - System.out/System.in וכו.

כשאני מקבל קלט כמו פה

x = System.in.read();

הוא מוסיף לי את הערך 48 לקלט. למה, ואיך אני נפטר מזה מבלי כל פעם להוריד 48 כשאני מקבל קלט כמו פה -

x = System.in.read()-48;

תודה!

קישור לתוכן
שתף באתרים אחרים

  • תגובות 30
  • נוצר
  • תגובה אחרונה

בהנחה שהטיפוס של x הוא int - מה שעושה השורה היא להכניס ל-x את ערך ה-ascii של מה שאתה קורא, ולא את הערך המספרי שלו.

ערכי ה-ascii של הספרות הוא 48-57 (48 עבור '0', 57 עבור '9').

אתה צריך בעצם "להמיר" את האות למספר (אני לא זוכר איך עושים את זה בג'אווה).

קישור לתוכן
שתף באתרים אחרים

אההה עכשיו הבנתי :P חחח.

כן אז באמת הבנתי מה אני צריך לעשות לדוגמה

price=Double.parseDouble(console.readLine());

יש לי שאלה עכשיו בקשר לקטע הגרפי.

איך אני יכול לעשות שה- Frame יפתח קצת יותר כשאני מריץ את התוכנית? ואיך אני יכול לקבוע את הגודל המקסימלי שלו?

הצלחתי לעשות את זה עם זה

frame.setBounds(0, 0, 640, 480);

הבעיה היא שהוא לא מראה לי כלום שם עד שאני משנה את הגודל של החלון עם העכבר.

קישור לתוכן
שתף באתרים אחרים

יש לי בעיה עם לצייר כמה גופים על המסך.

frame.getContentPane().add(b[0]);

frame.getContentPane().add(grid);

יש לי ב-

b[0]

את הקוד הנ"ל (תקין חלוטין)

public void paint(Graphics g){

g.drawRect(50,50, 2, 20);

}

וב- grid יש לי את הקוד הנ"ל

public void paint(Graphics g)

{

g.drawLine(0,0, 40, 20);

}

בשניהם הם מוגדרים כמחלקות שיורשות מ- JPanel.

הבעיה היא שאני לא מצליח ששני הצירוים יהיו על המסך באותו הזמן עם הפקודות

frame.getContentPane().add(b[0]);

frame.getContentPane().add(grid);

מביניהים הוא מצייר רק את האחרון. איך אני יכול לגרום לכולם להיות מצוירים על המסך?

ופתרון כזה לא יעזור לי

public void paint(Graphics g)

{

g.drawLine(0,0, 40, 20);

g.drawRect(50,50, 2, 20);

}

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

  • 2 שבועות מאוחר יותר...

הי שוב :P

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

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

import java.awt.*;

import javax.swing.*;

import java.awt.font.FontRenderContext;

import java.awt.font.TextLayout;

import java.awt.geom.*;

import java.awt.Font;

public class normGraph extends JFrame

{

public normGraph()

{

super("Stock Grid");

setSize(720,640);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

SignPanel sp = new SignPanel();

Container content = getContentPane();

content.add(sp);

setContentPane(content);

setVisible(true);

}

public static void main(String[] arguments) {

normGraph picture = new normGraph();

}

class SignPanel extends JPanel

{

public void paintComponent(Graphics comp)

{

super.paintComponent(comp);

Graphics2D c=(Graphics2D) comp;

Point2D.Double[] p=new Point2D.Double[20];

c.setColor(Color.white);

c.fillRect(0, 0, 720, 640);

//Draws the drawing box

Color g=new Color(230,230,230);

c.setColor(g);

c.fillRect(60, 60, 600, 500);

//Draws the table

p[0]=new Point2D.Double(60,60);

p[1]=new Point2D.Double(660,560);

int count=2;

c.setColor(Color.black);

//Will draw horizontal lines

for (double i=60;i<=500;i=i+(500/5))

{

p[count]=new Point2D.Double(0,i);

c.drawLine(60, (int)i,660, (int)i);

}

//Will draw vertical lines

for (double i=60;i<=600;i=i+(600/3))

{

p[count]=new Point2D.Double(0,i);

c.drawLine((int)i, 60,(int)i,560 );

}

//will draw the graph

FontRenderContext frc = c.getFontRenderContext();

Font f = new Font("Helvetica",Font.BOLD, 48);

String s = new String("This is the Stock!");

TextLayout tl = new TextLayout(s, f, frc);

Dimension theSize=getSize();

GradientPaint magentatogreen =new GradientPaint(100,0,Color.magenta,300, 0,Color.green);

c.setPaint(magentatogreen);

tl.draw(c, 40, 40);

}

}

}

אני אפטר מה- Void Main שיש שם, הוא שם רב בשביל לוודא שהכל פועל כמו שצריך.

הבעיה שלי היא שאני רוצה שקטע הקוד הבא יקבל פרמטר מחלקה מסוימת (קוראים לה Stock לצורך העניין) ויציר ע"פ הנתונים שלה.

הבעיה היא ש- Java לא מאפשרת לפעולה

public void paintComponent(Graphics comp)

להיות סטטית. בכלל אין באפשרותי לגרום למחלקה הנ"ל להיות Static בכדי שאוכל להפוך אותה לפעולה לכל דבר.

איך אני יכול לגרום לקטע קוד זה לקבל פרמטר מסוג Stock?

קישור לתוכן
שתף באתרים אחרים

השיטה paintComponent כבר קיימת במחלקה JFrame, ואתה עושה לה OverWrite..

וכשעושים OverWrite אי אפשר לשנות את השיטה לסטטית, להפך אני די בטוח שזה עובד אבל זה לא קשור..

בקיצור אם תשנה את הפרטרים, אז אתה עושה בעצם OverLoad ששם אין בעיה לשנות לסטטי..

public static void paintComponent(Stock comp)

אז אני דיי בטוח שזה יעבוד..

אם לא אז תשנה את שם השיטה למשהו חדש =]

קישור לתוכן
שתף באתרים אחרים

מה זאת אומרת לשמור ב- SignPanel רפרנס לStock?

לצור העניין זו המחלקה Stock

public class Stock

{

public double price;

public double high;

public double low;

public double start;

public double prev;

public double change;

public double volume;

public String name;

public Date d=new Date(0,0,0);

public Stock()

{

this.price=0;

this.high=0;

this.low=0;

this.start=0;

this.prev=0;

this.volume=0;

this.change=0;

this.name="Default";

}

public Stock(double price,double high,double low,double start,double prev,double volume,double change,String name)

{

this.price=price;

this.high=high;

this.low=low;

this.start=start;

this.prev=prev;

this.volume=volume;

this.change=change;

this.name=name;

}

public String toString()

{

return ("Stock name is: "+this.name+"\n Stock date is: "+this.d.toString()+"\n Stock price is:" +this.price);

}

}

(לא שזה כל כך רלוונטי, אבל היא מקבלת את הנתונים אח"כ)

Buffer - זה מה שניסיתי להסביר לך.

העתקתי את השורה שלך וגם כששיניתי את השם של הפעולה זה עדיין נתן לי את השגיאה הזו.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...