PDA

View Full Version : سوال: روش نوشتن یک برنامه؟



AVR programmer
دوشنبه 21 تیر 1395, 23:13 عصر
دارم برنامه ای مینویسم که با تغییر یک slider شعاع دایره ای که رسم شده تغییر پیدا کنه و دایره کوچک و بزرگ بشه !
که در کار با دایره دچار مشکل شدم چون اندازه دایره تغییر نمیکنه و برنامه ارور میده لطفا در تکمیل و اشکال یابی برنامه کمکم کنید .
اینم برنامه است :

package jslider;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Paint;
import java.awt.Point;


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSlider;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JTextField;


public class jslider1 extends JFrame {


private JPanel contentPane;
private JTextField textField;
private int r = 100;
private Graphics gr = null;


/**
* Launch the application.
*/
public static void main(String[] args) {


EventQueue.invokeLater(new Runnable() {
public void run() {
try {
jslider1 frame = new jslider1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}


}


});
}


/**
* Create the frame.
*/


public jslider1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);


JSlider slider = new JSlider();
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0) {
int r = slider.getValue();
textField.setText(String.valueOf(r));
paint(gr);
}
});
slider.setBounds(28, 36, 200, 23);
contentPane.add(slider);


textField = new JTextField();
textField.setBounds(28, 115, 200, 23);
contentPane.add(textField);
textField.setColumns(10);


}


@Override
public void paint(Graphics g) {
super.paintComponents(g);
g.setColor(Color.CYAN);
g.fillOval(250, 150, r, r + 10);


}


}



اینم عکس از اجرای برنامه :
141395

vahid-p
سه شنبه 22 تیر 1395, 20:45 عصر
در خط 73 شما gr رو به paint پاس دادید، در حالی که gr جایی تعریف نشده و مقدارش null هست.

به نظرم از اونجایی که jframe شامل slider و textfield و... هست، بهتره یک JPanel دیگه ای تعریف کنید و در اون Jpanel بیضی (oval) رو رسم کنید.
(بعد از اینکه رو این مباحث مسلط شدید، به نظرم بهتره به سمت JavaFX برید که خیلی گرافیک قشنگتری برای چنین موارد وجود داره.)
این کد جواب میده:

package jslider;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.accessibility.AccessibleRole;


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSlider;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JTextField;


public class JSlider1 extends JFrame {


private JPanel contentPane;
private JTextField textField;
private int r = 100;
private Graphics gr = null;
private MyJPanel circlePanel;


/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JSlider1 frame = new JSlider1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}


/**
* Create the frame.
*/
public JSlider1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
circlePanel = new MyJPanel();
circlePanel.setBounds(250, 150, 150, 150);
JSlider slider = new JSlider();
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
r = slider.getValue();//int r = slider.getValue();
textField.setText(String.valueOf(r));
circlePanel.updateUI();
}
});
slider.setBounds(28, 36, 200, 23);
contentPane.add(slider);
textField = new JTextField();
textField.setBounds(28, 115, 200, 23);
contentPane.add(textField);
textField.setColumns(10);
contentPane.add(circlePanel);
}


private class MyJPanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paintComponents(g);
g.clearRect(0, 0, 150, 150);
g.setColor(Color.CYAN);
g.fillOval(0, 0, r, r + 10);
}
}
}