Trouble buffering transparent gif
I've been working on a fairly simple interface that allows multiple people to use sprites and walk around in a room conected through the internet. I've been having lots of the normal trouble with flickering but I had solved it with buffering. As soon as I started trying to use a transparent gif as the sprite the flickering returned. Here I have greatly simplified my program to basicaly just show the flickering after you hit connect so there is a lot of stuff that was used in the full version but is pointless here. If you make "sprite.gif" a normal gif there is no problem, but when parts of the gif are transparent there is noticeable flickering. Does anyone know why this happens?
Code:
import javax.swing.*;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URL;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedInputStream;
import java.io.ObjectInputStream;
public class GifDisplay extends JPanel implements ActionListener {
JTextArea topTextArea;
Color m_clrBg = new Color(0, 0, 100);
static JTextArea bottomTextArea;
JButton button1, button2;
final static String newline = "\n";
static JTextField namef, input_text; // Textfields
Button display_button; // Display button
static JLabel message, input_label, output_label; // Labels for textfields
String out_string;
static JButton button;
static Image image, image1, image2, image3, image4, image5, image6;
static JTextArea textArea, online;
static int start, start2;
static Color squareColor; // The color of the square.
int squareTop, squareLeft; // Coordinates of top-left corner of square.
boolean focussed = false; // True when this applet has input focus.
static boolean init = false;
static DisplayPanel canvas; // The drawing surface on which the applet draws,
// belonging to a nested class DisplayPanel, which
// is defined below.
Image m_imgOffScr = null; // Image for off-screen drawing -- "back buffer"
Graphics m_gOffScr = null; // Graphics drawing interface to offscr image
public GifDisplay() {
super(new GridBagLayout());
GridBagLayout gridbag = (GridBagLayout) getLayout();
GridBagConstraints c = new GridBagConstraints();
message = new JLabel("Enter Name:");
gridbag.setConstraints(message, c);
add(message);
c.weightx = 1;
c.ipadx = 250;
namef = new JTextField(15);
namef.setEditable(false);
namef.setForeground(Color.BLACK);
gridbag.setConstraints(namef, c);
add(namef, c);
c.ipadx = 0;
c.weightx = 0;
c.ipady = 60;
c.gridwidth = 2;
c.gridheight = 2;
c.gridx = 0;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
bottomTextArea = new JTextArea();
bottomTextArea.setEditable(false);
JScrollPane bottomScrollPane = new JScrollPane(bottomTextArea);
gridbag.setConstraints(bottomScrollPane, c);
add(bottomScrollPane);
c.ipady = 80; //reset to default
c.ipadx = 60; //make this component tall
c.weighty = 1.0;
c.weightx = .8;
c.gridwidth = 0;
c.gridheight = 3;
c.weighty = 1;
// c.ipady = 40; //make this component tall
c.gridx = 3;
c.gridy = 0;
online = new JTextArea();
online.setEditable(false);
JScrollPane onlinePane = new JScrollPane(online);
// bottomScrollPane.setPreferredSize(preferredSize);
gridbag.setConstraints(onlinePane, c);
add(onlinePane);
c.weightx = 0.0;
c.gridwidth = 4;
c.gridx = 0;
c.gridy = 3;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
squareColor = Color.red;
canvas = new DisplayPanel(); // Create drawing surface and
canvas.setBackground(Color.white); // Set the background color of the canvas.
squareTop = canvas.getSize().height - canvas.getSize().height / 10 / 2;
squareLeft = canvas.getSize().width - canvas.getSize().height / 10 / 2;
gridbag.setConstraints(canvas, c);
add(canvas);
c.fill = GridBagConstraints.NONE;
c.ipady = 0; //reset to default
c.weightx = 0;
c.weighty = 0;
c.gridwidth = 3;
c.gridx = 0; //aligned with button 2
c.gridy = 7; //third row
c.gridwidth = 1;
button1 = new JButton("Connect");
gridbag.setConstraints(button1, c);
add(button1);
start = 1;
button1.addActionListener(this);
namef.addActionListener(this);
URL url = this.getClass().getResource("sprite.gif");
image3 = getToolkit().getImage(url);
setPreferredSize(new Dimension(500, 500));
}
class DisplayPanel extends JPanel {
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
while (Abstract.paint) {}
if (refresh.buffer1 != null) {
g.drawImage(Abstract.buffer, 0, 0, this); // Just display the "back" buffer
} else {
g.setColor(m_clrBg);
g.drawRect(0, 0, getSize().width, getSize().height);
}
Abstract.paint = true;
}
} // end nested class DisplayPanel
public static void disp(String mes) {
bottomTextArea.append(mes);
bottomTextArea.setCaretPosition(bottomTextArea.getDocument().getLength());
Toolkit.getDefaultToolkit().beep();
}
public static void onup(User c[]) {
online.setText("");
for (int l = 0; l < c.length; l++) {
if (c[l].active && c[l].name != null) {
online.append(c[l].name + newline);
}
}
}
public static void sen(String h) {
try {
PrintWriter os = new PrintWriter(Abstract.soccer().
getOutputStream());
os.print(h + "\r\n");
os.flush();
init = true;
} catch (java.io.IOException c) {
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(button1)) {
if (start == 0) {
start = 1;
sen(":exit:");
System.err.println("Exit");
namef.setEditable(false);
button1.setText("Connect");
message.setText("Enter Name:");
} else {
start = 0;
new refresh().start();
start2 = 0;
}
}
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("GifDisplay");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new GifDisplay();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
class Abstract {
static Socket s;
static int serial;
static String c[];
static String name;
static Image buffer;
static boolean paint = false;
static JFrame fra;
public static Socket soccer() {
return s;
}
public static void soccer(Socket soc) {
s = soc;
}
public static void retu(String a[]) {
c = a;
}
public static void retun(String a) {
name = a;
}
public static void fram(JFrame a) {
fra = a;
}
public static void ser(int a) {
serial = a;
}
}
class refresh extends Thread {
static int f[][];
Color m_clrBg = new Color(0, 0, 100);
static Image buffer1;
Graphics pad;
final static String newline = "\n";
private User m[];
Image image;
public void run() {
int place = Abstract.serial;
while (true) {
if (Abstract.paint) {
painter(place);
GifDisplay.canvas.repaint();
}
}
}
public void painter(int place) {
int width = GifDisplay.canvas.getSize().width; // Width of the applet.
int height = GifDisplay.canvas.getSize().height; // Height of the applet.
buffer1 = GifDisplay.canvas.createImage(GifDisplay.canvas.getSize().width,
GifDisplay.canvas.getSize().height);
pad = buffer1.getGraphics();
pad.drawImage(GifDisplay.image3, 55, 55,
width / 25, height / 25 * 2,
GifDisplay.canvas);
Abstract.buffer = buffer1;
Abstract.paint = false;
}
}