KAY111 0 Newbie Poster

Hey,

I am writing this program in which I get x and y coordinates on stdout from a C program.....something like
23 34
45 56
21 56
..
.

and so on....
now I need to pipe these values into a Java program and display a cube at the corresponding x and y values.....

so I tried using <c program> | java Tail....but it doesnt seem to take any input at all.

The code is as follows:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.io.*;
import java.util.*;

public class Tail extends JPanel{

  private static int mX, mY;

  private static Image mImage;


  public static void main(String[] args) {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String str=null;
    JFrame f = new JFrame();
    f.getContentPane().add(new Tail());
    f.setSize(400, 600);
    f.show();
    while(true)
    {
     try
     {
     while((str=br.readLine())!=null);
     
     String ak[]=new String[2];
     ak=str.split(" ");
     mX=Integer.parseInt(ak[0]);
     mY=Integer.parseInt(ak[1]);
     System.out.println(mX+"  "+mY);
     }
     catch(Exception e)
     {}
     }
  }

  public void update(Graphics g) {
    paint(g);
  }

  public void paint(Graphics g) {
    // Clear the offscreen image.
    Dimension d = getSize();
    checkOffscreenImage();
    Graphics offG = mImage.getGraphics();
    offG.setColor(getBackground());
    offG.fillRect(0, 0, d.width, d.height);
    // Draw into the offscreen image.
    paintOffscreen(mImage.getGraphics());
    // Put the offscreen image on the screen.
    g.drawImage(mImage, 0, 0, null);
   repaint();
    
  }

  private void checkOffscreenImage() {
    Dimension d = getSize();
    if (mImage == null || mImage.getWidth(null) != d.width
        || mImage.getHeight(null) != d.height) {
      mImage = createImage(d.width, d.height);
    }
  }

  public void paintOffscreen(Graphics g) {
    int s = 100;
    g.setColor(Color.blue);
    g.fillRect(mX - s / 2, mY - s / 2, s, s);
  }
}

Please tell me what am I doing wrong....and what should be done.

Dani AI

Generated

— the program is almost working but has a few bugs that make it appear to ignore input. The key problems are: a stray semicolon that empties the read loop and leaves str null (then exceptions are swallowed), updating Swing from the wrong thread, and calling repaint() from inside paint (which causes endless repaints). Also remember that a piped C program may be fully buffered when not attached to a terminal, so it might not flush lines unless you explicitly flush stdout.

Fix approach (summary):

  • Remove the stray semicolon and don’t swallow exceptions; at least printStackTrace so you can see errors.
  • Read stdin on a background thread, parse each line, then post updates to the Event Dispatch Thread with SwingUtilities.invokeLater.
  • Do not call repaint() inside paint/update. Override paintComponent(Graphics) and call super.paintComponent(g).
  • Ensure your C producer flushes output (e.g., fflush(stdout) in C or std::endl in C++) or run the producer via ProcessBuilder and read its stream from Java.

Example read-loop pattern (run once, in background) that updates a panel safely:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Thread reader = new Thread(() -> {
    String line;
    try {
        while ((line = br.readLine()) != null) {
            String[] p = line.trim().split("\\s+");
            if (p.length < 2) continue;
            final int x = Integer.parseInt(p[0]);
            final int y = Integer.parseInt(p[1]);
            SwingUtilities.invokeLater(() -> {
                panel.setCoords(x, y);
                panel.repaint();
            });
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
});
reader.setDaemon(true);
reader.start();

Additional tips:

  • Use frame.setVisible(true) and frame.setDefaultCloseOperation(...) instead of show().
  • Keep coordinate updates on the EDT or mark shared fields volatile / synchronize access.
  • If piping still seems empty, add fflush(stdout) in the C code or use ProcessBuilder from Java to run the C program and read its output directly.
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.