2015-09-06 5 views
0

Я разрабатываю легкий графический API для различных нужд, где хочу визуализировать изображение до его отображения. Я превзошел Компонент AWT, чтобы добиться максимальной производительности. Однако, если я визуализирую изображение (рисовать линии, прямоугольники &) в методе paint, процесс рисования становится видимым пользователю, если метод часто вызывается (например, изменение размера окна или анимация воспроизводится) , и это довольно эффективное решение.Самый быстрый способ рисовать один пиксель в графике Java AWT

Я решил кэшировать и визуализировать изображение отдельно и просто копировать пиксели в объект Graphics в методе paint. Но теперь я не знаю, как нарисовать один пиксель для объекта Graphics. Я полагаю, что у подстилающей реализации Sun такой метод, но я не должен обращаться к этому классу. Я знаю, что класс Graphics объявляет несколько методов (drawLine, drawRect, fillRect и т. Д.), Которые кажутся легкими и могут использоваться только для рисования одного пикселя, но я не знаю, какой из них будет самым быстрым.

Я не хочу использовать BufferedImage из-за некоторых проблем с памятью, и поэтому drawImage в этом случае не является решением. Это также не тот случай, который задан в this question, потому что, опять же, я не использую изображения, и я не создаю новые экземпляры в методе paint (класс данных визуализированных изображений изменяется только при изменении размера компонента).

TL; др: самый быстрый метод в java.awt.Graphics, чтобы установить цвет некоторого пикселя своими координатами на указанный цвет (java.awt.Color или RGB, последняя предпочтительнее).

Заранее спасибо.

ответ

0

Если вы когда-нибудь почувствовали, что вам нужно вызвать repaint() и у вас есть paintComponent (Graphics g) STOP немедленно. Играйте с этим, что я сделал сегодня утром. упаковка домашнее животное;

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.IOException; 
import javax.swing.*; 


public class pet extends JPanel implements MouseListener{ 
public static JFrame frame = new JFrame("frame"); 
public pet() throws IOException{ 
setPreferredSize(new Dimension(870, 675));   //configuring panel 
addMouseListener(this); 
} 
public static void main(String[] args) throws IOException{ 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JComponent newContentPane = new pet(); 
    newContentPane.setOpaque(true); 
    frame.setContentPane(newContentPane); 
    frame.pack(); 
    frame.setVisible(true); 
    frame.addMouseListener(new pet()); 
} 
public void paintRectangleAtPoint(Graphics g, int x, int y){ 
g.setColor(Color.BLACK); 
g.drawRect(x, y, 100,100); 
} 
public void paintStuff(Graphics g, int x, int y){ 
g.setColor(Color.BLACK); 
g.drawRect(x, y, 100,100); 
} 
@Override 
public void mouseClicked(MouseEvent e) { 
paintStuff(frame.getGraphics(),e.getX(), e.getY()); 
} 
@Override 
public void mousePressed(MouseEvent e) { 
// TODO Auto-generated method stub 
} 
@Override 
public void mouseReleased(MouseEvent e) { 
// TODO Auto-generated method stub 
} 
@Override 
public void mouseEntered(MouseEvent e) { 
// TODO Auto-generated method stub 
} 
@Override 
public void mouseExited(MouseEvent e) { 
// TODO Auto-generated method stub 
} 
} 

Поиграйте с этим, это довольно просто, скажите мне, если вы хотите, чтобы некоторые комментируя

+0

в то, что вы называете свой метод рисования, вы можете пройти по х, у координаты, а затем сделать g.drawRect (xCoord , yCoord, 1,1); –

Смежные вопросы