簡體   English   中英

如何在JFrame Java中從用戶輸入中繪制字符串

[英]How do I draw string from user input in a JFrame Java

無法從搜索功能中找到所需的內容,可能是標題的格式不正確。

無論如何,現在我可以單擊我的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(...)獲取用戶的輸入String。 另外,不要像在paint或paintComponent方法之外一樣使用Graphics,因為這是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;
    }
}

如果您絕對必須使用Graphics繪制String,則在上面的方法中,設置對象的字段,也許像private String textToDraw ,在GUI上以及JPanel protected void paintComponent(Graphics g)方法中調用repaint() 。繪制文本。

這是一個合並代碼,將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中繪制。 將該文本放入Map<Point, String> ,然后通過遍歷此地圖在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();
         }
      });
   }
}

如果我正確理解您的問題,那么您基本上需要一個KeyListener

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);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM