简体   繁体   中英

Printing the value in a variable in Swing Java

This is my program. I want to print the st variable. I am able to print the value stored in st in the console. Just help me in printing that particular value in the winow at some desired positions. I have tried to use drawString and Jlabel concept but its showing some warnings.

import java.awt.Graphics;
import java.io.*;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JComponent;
import javax.swing.JFrame;
//import javax.swing.JLabel;
//import javax.swing.JPanel;
class MyCanvas extends JComponent {
    private static final long serialVersionUID = 1L;
    //String st="hi";
    public void ScanXan() throws FileNotFoundException{
        try (Scanner s = new Scanner(new BufferedReader(new FileReader("serialdata.txt")))) 
        {
            s.useDelimiter("�");//Delimter defination
            while (s.hasNext())
            {
                String st= s.next(); 
                //Thread.sleep(1000);
                System.out.println(st);
            }
        }
    }
    @Override
        public void paint(Graphics g) {
            g.drawString("OLD AGE PEOPLE HEALTH ASSISTANT SYSTEM",600,100);//title
            g.drawString("AC BED ROOM 1",480,160);//upper room name 
            g.drawString("AC BED ROOM 2",480,410);//lower room name
            g.drawString("HALL",920,160);//hall name

            g.drawRect (450, 130, 600, 500);//largest rectangle

            g.drawRect (350, 350, 50, 60);//sender node
            g.drawRect (950, 350, 50, 60);//receiver node
            g.drawRect (660, 160, 50, 60);//relay node 1 bed room1 
            g.drawRect (660, 540, 50, 60);//relay node 2 bed room2

            g.drawString("SENDER",350,340);//sender name
            g.drawString("RECEIVER",950,340);//receiver name
            g.drawString("RELAY NODE 1",660,150);//relay node1 name 
            g.drawString("RELAY NODE 2",660,620);//relay node2 name
            //g.drawString(st,650,610);



            g.drawLine(900,130,900,630);//vertical line
            g.drawLine(450,380,900,380);//horizontal line

            //g.drawLine(410,350,660,230);//arrow

            //g.drawOval(400,230,50,50);
            //g.drawOval(60,250,50,50); 
            //g.drawOval(400,230,50,50); 
            //g.drawOval(600,250,50,50);  
            //g.drawLine(350,300,350,800); 
        }

}

public class DrawRect {
    public static void main(String[] a) throws FileNotFoundException {
        MyCanvas mc=new MyCanvas();
        mc.ScanXan();
        //JPanel pane= new JPanel();
        //JLabel text1 = new JLabel();
        //text1.setText(String st);

        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setBounds(30, 30, 300, 300);
        window.getContentPane().add(new MyCanvas());
        window.setVisible(true);
    }
}

Before going into the issues with how you've broken the painting chain of Swing, you need to ask your self the question, how does your paint method know anything about the values you want to print, given the fact that the paint method is called by a part of the API you don't have any control over...

See Painting in AWT and Swing and Performing Custom Painting for more details

You could...

Use a JTextArea ...

public class MyCanvas extends JComponent {

    private static final long serialVersionUID = 1L;

    private JTextArea ta;

    public void ScanXan() throws FileNotFoundException {
        setLayout(new BorderLayout());
        ta = new JTextArea();

        add(new JScrollPane(ta));
        try (Scanner s = new Scanner(new BufferedReader(new FileReader("serialdata.txt")))) {
            s.useDelimiter("�");//Delimter defination
            while (s.hasNext()) {
                String st = s.next();
                ta.append(st + "\n");
            }
        }
    }

}

See How to Use Text Areas for more details...

You could...

Use a JList ...

public class MyCanvas extends JComponent {

    private static final long serialVersionUID = 1L;

    private JList list;

    public void ScanXan() throws FileNotFoundException {
        setLayout(new BorderLayout());
        DefaultListModel<String> model = new DefaultListModel<>();
        list = new JList(model);

        add(new JScrollPane(list));
        try (Scanner s = new Scanner(new BufferedReader(new FileReader("serialdata.txt")))) {
            s.useDelimiter("�");//Delimter defination
            while (s.hasNext()) {
                String st = s.next();
                model.addElement(st);
            }
        }
    }

}

See How to Use Lists for more details

But...

It seems that you're trying to generate some kind of diagram...

So, instead, you will need someway to hold the values you want to print until paintComponent can be called, a java.util.List might do, for example...

public class MyCanvas extends JComponent {

    private List<String> listOfValues;

    public void ScanXan() throws FileNotFoundException {
        listOfValues = new ArrayList<>(25);
        try (Scanner s = new Scanner(new BufferedReader(new FileReader("serialdata.txt")))) {
            s.useDelimiter("�");//Delimter defination
            while (s.hasNext()) {
                String st = s.next();
                listOfValues.add(st);
            }
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        FontMetrics fm = g.getFontMetrics();
        int yPos = 0;
        for (String st : listOfValues) {
            g.drawString(st, 0, yPos + fm.getAscent());
            yPos += fm.getHeight();
        }
    }

}

I have made certain modification over the code. Please provide me the modified code so that I can perform the following operation.

  1. Read a single line from the text field.
  2. Store that line in the form of string an print in the swing window.
  3. Display that particular value for some time(for eg 3 sec)
  4. Now again update the st variable and store the next line in that variable.
  5. Again update the displayed value.
  6. Repeat all the operation till the end of text file is reached.
import java.awt.Graphics;
import java.io.*;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JFrame;
//import javax.swing.JLabel;
//import javax.swing.JTextField;
//import javax.swing.JLabel;
//import javax.swing.JPanel;
class MyCanvas extends JComponent {
private static final long serialVersionUID = 1L;
private String st="";

public void ScanXan() throws FileNotFoundException, InterruptedException{
  try (Scanner s = new Scanner(new BufferedReader(new        FileReader("E:\\tamilselvan\\java \\serialdata.txt")))) {
      //String st;  
      s.useDelimiter("�");//Delimter defination

        while (s.hasNext())
        {
            setSt(s.next()); 
        Thread.sleep(100);
        System.out.println(getSt());
        }

   }
    }

  @Override
  public void paint(Graphics g) {
  g.drawString("OLD AGE PEOPLE HEALTH ASSISTANT SYSTEM",600,100);//title
  g.drawString("AC BED ROOM 1",480,160);//upper room name 
  g.drawString("AC BED ROOM 2",480,410);//lower room name
  g.drawString("HALL",920,160);//hall name

  g.drawRect (450, 130, 600, 500);//largest rectangle

  g.drawRect (350, 350, 50, 60);//sender node
  g.drawRect (950, 350, 50, 60);//receiver node
  g.drawRect (660, 160, 50, 60);//relay node 1 bed room1 
  g.drawRect (660, 540, 50, 60);//relay node 2 bed room2

  g.drawString("SENDER",350,340);//sender name
  g.drawString("RECEIVER",950,340);//receiver name
  g.drawString("RELAY NODE 1",660,150);//relay node1 name 
  g.drawString("RELAY NODE 2",660,620);//relay node2 name
    //String rt="hiiiiiiiiiiiiiii";
    g.drawString(st,650,610);



  g.drawLine(900,130,900,630);//vertical line
  g.drawLine(450,380,900,380);//horizontal line


 }

 /**
 * @return the st
 */
 public String getSt() {
    return st;
 }

/**
 * @param st the st to set
 */
public void setSt(String st) {
    this.st = st;
}

}

public class DrawRect {
/*public void getData(String st)
{
    String st1=st;
}*/  
public static void main(String[] a) throws FileNotFoundException {
MyCanvas mc=new MyCanvas();
    try {
        mc.ScanXan();
    } catch (InterruptedException ex) {
    Logger.getLogger(DrawRect.class.getName()).log(Level.SEVERE, null,       ex);
    }

//JTextField t = new JTextField();
//String s = "Blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah";

//t.setText(s);
//JPanel pane= new JPanel();

//JLabel text1 = new JLabel();
//text1.setText("hiiiiiiiiiiiiiiiiiiiiiiiiiii");

JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 300, 300);
window.getContentPane().add(new MyCanvas());
window.setVisible(true);
}}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM