Во-первых, вам нужно прочитать Рисование в AWT и Swing , чтобы лучше понять, как рисование работает в Swing и AWT.
Далее вам нужно прочитать JavaDocs для Canvas
, чтобы лучше понять, какие функции вы можете переопределить.
Одна из трудных для понимания концепций заключается в том, что вы фактически не контролируете систему рисования, которая позаботилась о вас (это как черная магия), вам просто нужно работать с ней, переопределяя соответствующие методы и взаимодействуя с API для запроса обновлений при необходимости.
Самая большая проблема с вашим кодом - public void paint(Graphics g, Drawing d) {
. Ничто не собирается вызывать это, поскольку это не метод, который распознает система рисования. Также возник бы вопрос, почему вам нужно передать ссылку Drawing
на экземпляр Drawing
, не уверенный во всем этом.
Еще одна проблема, с которой вы столкнулись ...
Drawing dr = new Drawing(100, 100, 200, 200);
JFrame frame = new JFrame("My Drawing");
Canvas canvas = new Drawing();
canvas.setBackground(Color.white);
frame.add(dr);
frame.add(canvas);
Вы добавляете два экземпляра Drawing
к JFrame
, так как по умолчанию работает BorderLayout
, только второй будет выложен, первый будет проигнорирован.
Опять же, не знаю почему, просто добавьте первый и покончите с этим.
Что-то, что «работает», может выглядеть примерно так ...
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Drawing extends Canvas {
int x1;
int y1;
int x2;
int y2;
public static void main(String[] args) {
Drawing dr = new Drawing(100, 100, 200, 200);
JFrame frame = new JFrame("My Drawing");
frame.add(dr);
frame.pack();
frame.setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawLine(x1, y1, x2, y2);
}
Drawing(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
Drawing() {
}
}
Вы, кажется, делаете фундаментальные ошибки при использовании API, и я настоятельно рекомендую вам потратить некоторое время на чтение Создание графического интерфейса с помощью JFC / Swing . Вы также обнаружите, что использование что-то вроде JPanel
вместо Canvas
даст вам лучшую производительность и результаты
#include <stdio.h>
#define E_PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
int main(int argc, char** argv)
{
long double pild = E_PI;
double pid = pild;
float pif = pid;
printf("%s\n%1.80f\n%1.80f\n%1.80Lf\n",
"3.14159265358979323846264338327950288419716939937510582097494459230781640628620899",
pif, pid, pild);
return 0;
}
Результаты:
[quassnoi #] gcc --version
gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)
[quassnoi #] ./test
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
^
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000
^
3.14159265358979311599796346854418516159057617187500000000000000000000000000000000
^
0000000001111111
1234567890123456
6 мест и 14 мест мест 1 - более чем 0 для этих 3, и последнее место, хотя сохранено нельзя рассмотреть как точку точности.
И извините, но я не знаю то, что расширенный означает без большего количества контекста. Вы имеете в виду десятичное число C#?
Печать и количество, ребенок, печать и количество. (Или считайте спецификации.)
Мир PI имеет PI к 100 000 000 000 цифрам, Вы могли просто распечатать и выдержать сравнение. Для немного более легкого для чтения Радости версии PI имеют 10 000 цифр. И если Вы хотите помнить цифры сами, Вы могли бы попробовать lerning стихотворение Cadaeic Cadenza.
Для кода C посмотрите на определения в <float.h>
. Это покрывает float
(FLT_*
), double
(DBL_*
) и long double
(LDBL_*
) определения.