如何从JFrame Java中的用户输入中提取字符串

如何从JFrame Java中的用户输入中提取字符串,java,string,text,input,Java,String,Text,Input,在搜索功能中找不到我要找的内容,我可能只是把标题写得很糟糕 不管怎样,现在我可以点击我的JFrame,它将把用户键入的任何内容绘制到控制台中,当你点击Enter键时,它将停止句子 但是我想要的是用户直接在JFrame中输入,然后当您点击enter时结束输入 这就是我现在拥有的: public void drawString(MouseEvent e) throws IOException { if(textClick==true) { int xLoc = e.getX

在搜索功能中找不到我要找的内容,我可能只是把标题写得很糟糕

不管怎样,现在我可以点击我的JFrame,它将把用户键入的任何内容绘制到控制台中,当你点击Enter键时,它将停止句子

但是我想要的是用户直接在JFrame中输入,然后当您点击enter时结束输入

这就是我现在拥有的:

 public void drawString(MouseEvent e) throws IOException {
    if(textClick==true) {
        int xLoc = e.getX();
        int yLoc = e.getY();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String accStr;

        System.out.println("Enter your Account number: ");
        accStr = br.readLine();
        g2.drawString(accStr, xLoc, yLoc);
        textClick=false;
    }
}

所以你点击JFrame上的某个地方。然后,它将显示用户在该位置键入的任何内容,而无需进入控制台并在那里键入。

不要将控制台输入与Swing GUI混合使用,因为这可能会导致线程噩梦。而是通过其他方式获取输入。我自己会使用
JOptionPane.showInputDialog(…)
来获取用户的输入字符串。另外,不要像在paint或paintComponent方法之外那样使用图形,因为这会导致NullPointerException或其他GUI故障。而是在JLabel或文本组件(如JTextArea或JTextField)中显示文本

比如:

 public void drawString(MouseEvent e) throws IOException {
    if(textClick) { // none of this == true stuff please
        int xLoc = e.getX();
        int yLoc = e.getY();
        String prompt = "Enter your Account Number:";
        String input = JOptionPane.showInputDialog(someComponent, prompt);

        // !!! no 
        // g2.drawString(accStr, xLoc, yLoc); // no don't do this

        myJLabel.setText(input); 

        textClick=false;
    }
}
如果绝对必须使用图形绘制字符串,那么在上面的方法中,设置对象的字段,可能类似于
私有字符串textToDraw
,在GUI上调用
repaint()
,并在JPanel的
受保护的void paintComponent(Graphics g)
方法中绘制文本

下面是一个乱码,它将JTextField放在鼠标按下的位置,然后在按enter键或焦点丢失时将JTextField转换为JLabel:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class AddingText extends JPanel {
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;

   public AddingText() {
      addMouseListener(new MyMouse());

      setLayout(null); // one of the few times this may be ok
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private void convertToLabel(final JTextField textField) {
      JLabel label = new JLabel(textField.getText());
      label.setSize(label.getPreferredSize());
      label.setLocation(textField.getLocation());
      remove(textField);
      add(label);
      repaint();
   }

   private class MyMouse extends MouseAdapter {
      @Override
      public void mousePressed(MouseEvent e) {
         final JTextField textField = new JTextField(20);
         textField.setSize(textField.getPreferredSize());
         textField.setLocation(e.getPoint());
         add(textField);         
         revalidate();
         repaint();

         textField.requestFocusInWindow();
         textField.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
               convertToLabel((JTextField) e.getComponent());
            }
         });
         textField.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
               convertToLabel((JTextField) e.getSource());
            }
         });
      }
   }

   private static void createAndShowGui() {
      AddingText mainPanel = new AddingText();

      JFrame frame = new JFrame("AddingText");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

尝试二:通过覆盖paintComponent和使用JOptionPane,直接在JPanel中绘制。文本被放置到
映射中
,然后通过迭代该映射在paintComponent中绘制该文本。这样我们就避免了可怕的
null
布局

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.swing.*;

public class AddingText2 extends JPanel {
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;
   private Map<Point, String> pointTextMap = new LinkedHashMap<>();

   public AddingText2() {
      addMouseListener(new MyMouse());
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setFont(getFont().deriveFont(Font.BOLD));
      for (Point p : pointTextMap.keySet()) {
         String text = pointTextMap.get(p);
         g.drawString(text, p.x, p.y);
      }
   }

   private class MyMouse extends MouseAdapter {
      @Override
      public void mousePressed(MouseEvent e) {
         String prompt = "Please add text to display";
         String input = JOptionPane.showInputDialog(AddingText2.this, prompt);
         pointTextMap.put(e.getPoint(), input);
         repaint();
      }
   }

   private static void createAndShowGui() {
      AddingText2 mainPanel = new AddingText2();

      JFrame frame = new JFrame("AddingText2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedHashMap;
导入java.util.Map;
导入javax.swing.*;
公共类AddingText2扩展了JPanel{
专用静态最终整数预值W=500;
私有静态final int PREF_H=PREF_W;
私有映射pointTextMap=新LinkedHashMap();
公共添加文本2(){
addMouseListener(newmymouse());
}
@凌驾
公共维度getPreferredSize(){
如果(isPreferredSizeSet()){
返回super.getPreferredSize();
}
返回新维度(PREF_W,PREF_H);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setFont(getFont().deriveFont(Font.BOLD));
对于(点p:pointTextMap.keySet()){
String text=pointTextMap.get(p);
g、 抽绳(文本,p.x,p.y);
}
}
私有类MyMouse扩展了MouseAdapter{
@凌驾
公共无效鼠标按下(MouseEvent e){
String prompt=“请添加要显示的文本”;
String input=JOptionPane.showInputDialog(AddingText2.this,提示符);
pointTextMap.put(例如getPoint(),输入);
重新油漆();
}
}
私有静态void createAndShowGui(){
AddingText2主面板=新的AddingText2();
JFrame=新JFrame(“添加文本2”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}

如果我正确理解了你的问题,你基本上需要一个
键盘监听器

public class MyWindow extends JFrame {

   private int x, y;
   private String text;
   private boolean shouldGetText = false;

   private KeyListener keyboard = new KeyAdapter() {
      public void keyTyped(KeyEvent evt) {
          if(!shouldGetText)
            return;

         text = text + evt.getChar(); // or evt.getKeyChar()... not sure about the name of this method
      }

      public void keyPressed(KeyEvent evt) {
          if (shouldGetText && evt.getKeyCode() == KeyEvent.VK_ENTER)
              shouldGetText = false;
      }
   }

   private MouseListener mouse = new MouseAdapter() {
       public void mouseMoved(MouseEvent evt) {
          if (shouldGetText)
             return;

          x = evt.getX();
          y = evt.getY();
       }

       public void mousePressed(MouseEvent evt) {
          shouldGetText = true;
          text = "";
       }
   }

   public MyWindow() {
       addKeyListener(keyboard);
       addMouseListener(mouse);
       addMouseMotionListene(mouse);

       // Do other stuff
   }

   @Override
   public void paint(Graphics g) {
       super.paint(g);
       g.drawString(text, x, y);
   }
}

有没有一种简单的方法可以像画画一样画出来?您可以直接键入您想要的内容write@EbolaInspector:是的,在鼠标单击的位置放置一个JTextField,让用户键入文本。@EbolaInspector:请参见上面的示例,我的意思是什么。@EbolaInspector:answer 2I感谢您帮助我=)我试图在我的项目中实现您的示例2,但是当我使用私有映射pointTextMap=newLinkedHashMap()时会出错;它说“在这种语言级别不支持菱形类型”直接在JFrame中绘制,风险自负。了解JFrames是非常复杂的组件,当覆盖paint时,您可能会弄乱JFrame的多个组件,包括JRootPane、glasspane、JLayeredPane和contentPane及其边框。另外,绘画方法不做双缓冲。是的,使用JPanel绘制会更好,你是对的。但我只是想要一些代码来说明如何使用
KeyListener
解决这个问题。但是你是对的,让这个类从
JPanel
扩展,或者做一些更好的事情^^