עבור לתוכן

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

Featured Replies

פורסם
  • מחבר

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

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

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

x = System.in.read();

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

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

תודה!

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

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

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

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

פורסם
  • מחבר

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

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

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

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

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

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

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

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

פורסם

1) תנסה לעשות pack.

2) תעשה setVisible(true)

אחרי שינוי הגודל.

פורסם

אם אתה רוצה להגביל את החלון בלי לקבוע את מיקומו על המסך:

frame.setPreferredSize(new Dimension(x, y));

פורסם
  • מחבר

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

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, הרכיבים שלך פשוט דורסים אחד את השני, ולכן רק האחרון יוצג.

פורסם

בעקרון הכי שימושיים זה שני אלה:

BorderLayout

FlowLayout

יש גם אתה GridBagLayout שהוא נחמד...

בהצלחה.

פורסם
  • מחבר

חחח כן התחלתי לחשוב שזה נהיה קצת מסובך מדי ויותר מדי בשביל שתוכלו לעזור לי.

סבבה אני אקרא הכל, ותודה רבה על העזרה!

  • 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)

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

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

פורסם
  • מחבר

גם אם אני משנה את שם השיטה זה לא עוזר.

זה ה- error שהוא רושם לי

the method paintComponent cannot be declared static; static methods can only be declared in a static or top level type

פורסם

זה בדיוק השגיאה שאמרתי,

אתה עושה overwrite ומשנה לגישת static זה לא אפשרי..

תשנה את השם ותשמור את הקובץ ואז אם תהיה שגיאה תעתיק אותה.

פורסם

תשמור בSignPanel רפרנס לStock.

תיצור פונקציה שנקראת setStock.

ואז בפונקציה paintComponent תוכל להשתמש במשתנה הזה.

ולמה אתה רוצה להפוך את הפונקציה לSTATIC. אין סיבה לעשות זאת.

פורסם
  • מחבר

מה זאת אומרת לשמור ב- 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 - זה מה שניסיתי להסביר לך.

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

ארכיון

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

דיונים חדשים