Hallo,
habe angefangen einen simplen Colorpicker zu programmieren. Komme allerdings mit dem Speicherverbrauch nicht zurecht. Wie und wo muss ich welche Ressourcen wieder freigeben, damit der Speicherverbrauch nicht ständig steigt?
Das Programm besteht bisher aus zwei Klassen. Die GUI besteht aus einer JFrame welche eine Imagepanel und eine JPanel enthält. In der Imagepanel wird die Umgebung des MouseCursors angezeigt. Der JPanel bekommt die Farbe zugewiesen auf welche der MouseCursor zeigt. Es werden hierzu zwei Threads benutzt.
Was muss ich ergänzen oder verbessern, damit ich den Speicherverbrauch einschränken kann?
Vg Erdal
habe angefangen einen simplen Colorpicker zu programmieren. Komme allerdings mit dem Speicherverbrauch nicht zurecht. Wie und wo muss ich welche Ressourcen wieder freigeben, damit der Speicherverbrauch nicht ständig steigt?
Das Programm besteht bisher aus zwei Klassen. Die GUI besteht aus einer JFrame welche eine Imagepanel und eine JPanel enthält. In der Imagepanel wird die Umgebung des MouseCursors angezeigt. Der JPanel bekommt die Farbe zugewiesen auf welche der MouseCursor zeigt. Es werden hierzu zwei Threads benutzt.
Was muss ich ergänzen oder verbessern, damit ich den Speicherverbrauch einschränken kann?
Code:
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Root extends JFrame implements Runnable {
ImgPanel ip = new ImgPanel();
Dimension d1 = new Dimension(200,200);
Dimension d2 = new Dimension(200,100);
JPanel jp = new JPanel();
public Root(String titel) {
super(titel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 300);
setLocationByPlatform(true);
setAlwaysOnTop(true);
setResizable(false);
ip.setPreferredSize(d1);
ip.setMaximumSize(d1);
jp.setBorder(BorderFactory.createEtchedBorder());
jp.setPreferredSize(d2);
jp.setMaximumSize(d2);
setLayout(new FlowLayout());
add(ip);
add(jp);
setVisible(true);
}
public static void main(String[] args) {
Root root = new Root("ColorPix");
root.startAnimation();
}
public void startAnimation () {
Thread th = new Thread(this);
th.start();
}
public void run() {
while (true) {
jp.setBackground(ip.c);
jp.repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Code:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class ImgPanel extends JPanel implements Runnable{
int x, y, xx, yy;
Color c;
Robot robot;
PointerInfo info;
Toolkit tk = Toolkit.getDefaultToolkit();
Rectangle rec;
BufferedImage image = new BufferedImage(20,20,BufferedImage.TYPE_INT_RGB);
int mx = 0;
int my = 0;
public void paintComponent(final Graphics g) {
super.paintComponent(g);
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
startAnimation();
g.drawImage(image, x, y, this.getWidth() - xx - x, this.getHeight()
- yy - y, this);
g.drawRect(100,100,10,10);
g.dispose();
}
public void startAnimation () {
Thread th = new Thread(this);
th.start();
}
public void run() {
while (true) {
info = MouseInfo.getPointerInfo();
mx = (int) info.getLocation().getX();
my = (int) info.getLocation().getY();
c = robot.getPixelColor(mx, my);
rec = new Rectangle(mx - 10, my - 10, 20, 20);
image = robot.createScreenCapture(rec);
repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Vg Erdal