Предложение от Nelson Yu.
Самый простой способ нарисовать строку - это нарисовать ее в paint(), т.е.
public void paint(Graphics g)
{
// This will draw the string in a red "TimesRoman" font
g.setColor(Color.red);
g.setFont(new Font("TimesRoman", Font.BOLD, 12));
// This draws the string given the x,y co-ordinates of the _baseline_
// Don't think the point you give it is the upper-left corner
g.drawString("Hi There", 10, 50)
}
Вы можете отменить расцветку в Панели, Фрейме, Диалоге, и т.д .. Я сказал бы подкласс Панель. Таким образом не смешивая окружение с подпрограммой расцветки Фрейма.
public class MyPanel extends Panel
{
...
...
public void paint(Graphics g)
...
}
Обратите внимание: "Графика" абстрактна, и таким образом вы не можете просто подтверждать. То есть,
Graphics g = new Graphics()
g.drawString(...);
является запрещенным в Java. Таким образом самый простой способ отыскивать графический образец - это paint(), update(), и т.д. Но если вы имеете любой образец графики, вам нужно нарисовать строку.
2. Как можно нарисовать линию ?
Предложени от Nelson Yu
drawLine(x1, y1, x2, y2) является методом в классе Graphics, так что вам будет нужен его образц. Вы не можете создавать его самостоятельно, так как он абстрактен. То есть.
// g - это образец графики
g.drawLine(10, 10, 100, 100);
// This is a nice little app I wrote for my "Introduction to the AWT"
// document. (A newbie guide before I overload them with information
// with my new (and IMPROVED) "AWT Tutorial").
// It draws 50 squares within each other
import java.awt.*;
public class FiftySquares extends Frame
{
float xA, yA, xB, yB, xC, yC, xD, yD,
xA1, yA1, xB1, yB1, xC1, yC1, xD1, yD1,p,q,r;
int i;
int x_center, y_center;
static final int H_SIZE = 300;
static final int V_SIZE = 300;
public FiftySquares()
{
q = (float)0.05;
p = 1 - q;
r = (float)0.95 * H_SIZE;
x_center = H_SIZE/2;
y_center = V_SIZE/2;
resize(H_SIZE, V_SIZE);
show();
}
public void paint(Graphics g)
{
xA = xD = x_center - r;
xB = xC = x_center + r;
yA = yB = y_center - r;
yC = yD = y_center + r;
for(i=0; i 0) ddx += 0.5; else ddx -= 0.5; // округление выключено
if (ddy > 0) ddy += 0.5; else ddy -= 0.5; // "
int dx = (int)ddx;
int dy = (int)ddy;
// Теперь мы можем вычислить угловые точки...
int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0] = startX + dx;
yPoints[0] = startY + dy;
xPoints[1] = startX - dx;
yPoints[1] = startY - dy;
xPoints[2] = endX - dx;
yPoints[2] = endY - dy;
xPoints[3] = endX + dx;
yPoints[3] = endY + dy;
// Заполняем прямоугольник эффективно рисуюя толстую линию
g.fillPolygon(xPoints, yPoints, 4);
}
13. Дано экранное изображение. Как можно "скопировать" многоугольную область из одного места в окне апплета в другое ? Как нарисовать только один из A/R/G/B каналов изображения ? Как вращать изображения по различным направлениям с течением времени ?
Предложение от Dean Jones
Я сделал это используя PixelGrabber и MemoryImageSource. Представте изображение 50x50, которое поворачивается на 90 градусов:
Image img = createImage(...);
int buffer[] = new int[50 * 50];
int rotate[] = new int[50 * 50];
PixelGrabber grabber = new PixelGrabber(img, 0, 0, 50, 50, buffer, 0, 50);
try
{
grabber.grabPixels();
}
catch(InterruptedException e)
{
...
}
for(int y = 0; y < 50; y++)
{
for(int x = 0; x < 50; x++)
{
rotate[((50-x-1)*50)+y] = buffer[(y*50)+x];
}
}
Image rot = createImage(new MemoryImageSource(50, 50, rotate, 0, 50));
14. Как можно листать изображение поперек экрана без оставления следа или иметь возможность каждый раз перерисовывать задний фон (спрайтовая анимация) ? Как изменить размер GIF при использовании метода getImage, а затем drawImage ?
Предложение от M. K. Kwong
Одна форма drawImage метода позволяет вам определять ширину wd и высоту ht (в пикселах) изображения, которое будет нарисовано. Отображаемое изображение будет затем масштабироваться к этим параметрам. Пример:
Image img = getImage("picture.gif");
g.drawImage(img,0,0,wd,ht,this);
Где g - графика, обычно находящаяся в paint (Graphics g) методе.
15. Как получить размер текстовой строки, которая будет на экране ?
Предложение от M. K. Kwong
Чтобы получить ширину строки tx, используйте
int tw = g.getFontMetrics().stringWidth(tx);
Чтобы получить ее высоту используйте (обратите внимание, что вы не должны упоминать строку tx в это время):
int th = g.getFontMetrics().getHeight();
Обе команды должны использоваться внутри контекста Grahpics g, также как в paint(Graphics g). В качестве альтернативы, если вы знаете шрифт f, который используется для строки, вы можете использовать
int tw = getFontMetrics(f).stringWidth(tx);
не включая g.
Самый простой способ нарисовать строку - это нарисовать ее в paint(), т.е.
public void paint(Graphics g)
{
// This will draw the string in a red "TimesRoman" font
g.setColor(Color.red);
g.setFont(new Font("TimesRoman", Font.BOLD, 12));
// This draws the string given the x,y co-ordinates of the _baseline_
// Don't think the point you give it is the upper-left corner
g.drawString("Hi There", 10, 50)
}
Вы можете отменить расцветку в Панели, Фрейме, Диалоге, и т.д .. Я сказал бы подкласс Панель. Таким образом не смешивая окружение с подпрограммой расцветки Фрейма.
public class MyPanel extends Panel
{
...
...
public void paint(Graphics g)
...
}
Обратите внимание: "Графика" абстрактна, и таким образом вы не можете просто подтверждать. То есть,
Graphics g = new Graphics()
g.drawString(...);
является запрещенным в Java. Таким образом самый простой способ отыскивать графический образец - это paint(), update(), и т.д. Но если вы имеете любой образец графики, вам нужно нарисовать строку.
2. Как можно нарисовать линию ?
Предложени от Nelson Yu
drawLine(x1, y1, x2, y2) является методом в классе Graphics, так что вам будет нужен его образц. Вы не можете создавать его самостоятельно, так как он абстрактен. То есть.
// g - это образец графики
g.drawLine(10, 10, 100, 100);
// This is a nice little app I wrote for my "Introduction to the AWT"
// document. (A newbie guide before I overload them with information
// with my new (and IMPROVED) "AWT Tutorial").
// It draws 50 squares within each other
import java.awt.*;
public class FiftySquares extends Frame
{
float xA, yA, xB, yB, xC, yC, xD, yD,
xA1, yA1, xB1, yB1, xC1, yC1, xD1, yD1,p,q,r;
int i;
int x_center, y_center;
static final int H_SIZE = 300;
static final int V_SIZE = 300;
public FiftySquares()
{
q = (float)0.05;
p = 1 - q;
r = (float)0.95 * H_SIZE;
x_center = H_SIZE/2;
y_center = V_SIZE/2;
resize(H_SIZE, V_SIZE);
show();
}
public void paint(Graphics g)
{
xA = xD = x_center - r;
xB = xC = x_center + r;
yA = yB = y_center - r;
yC = yD = y_center + r;
for(i=0; i 0) ddx += 0.5; else ddx -= 0.5; // округление выключено
if (ddy > 0) ddy += 0.5; else ddy -= 0.5; // "
int dx = (int)ddx;
int dy = (int)ddy;
// Теперь мы можем вычислить угловые точки...
int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0] = startX + dx;
yPoints[0] = startY + dy;
xPoints[1] = startX - dx;
yPoints[1] = startY - dy;
xPoints[2] = endX - dx;
yPoints[2] = endY - dy;
xPoints[3] = endX + dx;
yPoints[3] = endY + dy;
// Заполняем прямоугольник эффективно рисуюя толстую линию
g.fillPolygon(xPoints, yPoints, 4);
}
13. Дано экранное изображение. Как можно "скопировать" многоугольную область из одного места в окне апплета в другое ? Как нарисовать только один из A/R/G/B каналов изображения ? Как вращать изображения по различным направлениям с течением времени ?
Предложение от Dean Jones
Я сделал это используя PixelGrabber и MemoryImageSource. Представте изображение 50x50, которое поворачивается на 90 градусов:
Image img = createImage(...);
int buffer[] = new int[50 * 50];
int rotate[] = new int[50 * 50];
PixelGrabber grabber = new PixelGrabber(img, 0, 0, 50, 50, buffer, 0, 50);
try
{
grabber.grabPixels();
}
catch(InterruptedException e)
{
...
}
for(int y = 0; y < 50; y++)
{
for(int x = 0; x < 50; x++)
{
rotate[((50-x-1)*50)+y] = buffer[(y*50)+x];
}
}
Image rot = createImage(new MemoryImageSource(50, 50, rotate, 0, 50));
14. Как можно листать изображение поперек экрана без оставления следа или иметь возможность каждый раз перерисовывать задний фон (спрайтовая анимация) ? Как изменить размер GIF при использовании метода getImage, а затем drawImage ?
Предложение от M. K. Kwong
Одна форма drawImage метода позволяет вам определять ширину wd и высоту ht (в пикселах) изображения, которое будет нарисовано. Отображаемое изображение будет затем масштабироваться к этим параметрам. Пример:
Image img = getImage("picture.gif");
g.drawImage(img,0,0,wd,ht,this);
Где g - графика, обычно находящаяся в paint (Graphics g) методе.
15. Как получить размер текстовой строки, которая будет на экране ?
Предложение от M. K. Kwong
Чтобы получить ширину строки tx, используйте
int tw = g.getFontMetrics().stringWidth(tx);
Чтобы получить ее высоту используйте (обратите внимание, что вы не должны упоминать строку tx в это время):
int th = g.getFontMetrics().getHeight();
Обе команды должны использоваться внутри контекста Grahpics g, также как в paint(Graphics g). В качестве альтернативы, если вы знаете шрифт f, который используется для строки, вы можете использовать
int tw = getFontMetrics(f).stringWidth(tx);
не включая g.