简体   繁体   English

在Swing Java中将值打印到变量中

[英]Printing the value in a variable in Swing Java

This is my program. 这是我的程序。 I want to print the st variable. 我想打印st变量。 I am able to print the value stored in st in the console. 我可以在控制台中打印存储在st中的值。 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. 我尝试使用drawString和Jlabel概念,但显示一些警告。

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... 在讨论如何打破Swing的绘制链之前,您需要问自己一个问题:鉴于paint方法被调用,您的paint方法如何知道有关您要打印的值的任何信息通过API的一部分,您无法控制...

See Painting in AWT and Swing and Performing Custom Painting for more details 有关更多详细信息,请参见“ AWT中的绘画”和“摇摆执行自定义绘画

You could... 你可以...

Use a JTextArea ... 使用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 ... 使用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... 因此,相反,您将需要某种方式来保存要打印的值,直到可以调用paintComponent为止,例如,可能会使用java.util.List

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) 显示该特定值一段时间(例如3秒)
  4. Now again update the st variable and store the next line in that variable. 现在再次更新st变量,并将下一行存储在该变量中。
  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);
}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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