2015-11-14 3 views
1

Я написал этот код, который спрашивает пользователя, какую фигуру вы хотите отобразить, а затем отобразить в поле JFrame, моя проблема заключается в том, что вопрос отображается в поле консоли (внутри eclipse), а не в поле JFrame, поэтому как я могу изменить это?Как показать ввод пользователя в поле JFrame?

Также вопрос повторяется дважды, не уверен, почему.

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    this.setBackground(Color.WHITE); 


    Scanner user_input = new Scanner(System.in); 
    int shape_num; 
    System.out.println("What is the shape you want to draw? 1- Rectangle 2- Circle"); 
    shape_num = user_input.nextInt(); 
    if(shape_num ==1){ 
    g.setColor(Color.BLUE); 
    g.fillRect(25, 25, 150, 50); 
    } 
    else if(shape_num ==2) { 
    g.setColor(Color.RED); 
    g.fillOval(25, 80, 100, 100); 
} 
    else if (shape_num > 2) { 
     System.out.println("Error"); 
    } 
} 
    public static void main(String[] args){ 

      JFrame f = new JFrame("Title"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Rectangle r = new Rectangle(); 
      f.add(r); 
      f.setSize(400, 250); 
      f.setVisible(true); 


     } 

}

ответ

2

Святая мать всех вещей, драгоценных, не используйте сканер, который использует System.in в середине метода paintComponent. Это затмит вашу графическую программу до критической остановки. Шутки в сторону. Этот метод является одним из важнейших детерминантов воспринимаемой отзывчивости вашей программы GUI, и если вы каким-либо образом ее замедляете или прекратите (как вы это делаете), ваша программа полностью заморозится. Если вы кодируете графический интерфейс, то выполняйте все взаимодействия с пользователем через графический интерфейс, а не через консоль.

Например, вы можете использовать JRadioButtons, которые изменяют состояние поля в графическом интерфейсе, а затем рисуют соответственно. Например:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class ItssRectangle extends JPanel { 
    private static final String RECTANGLE = "Rectangle"; 
    private static final String OVAL = "Oval"; 
    private static final String[] SHAPES = { RECTANGLE, OVAL }; 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 250; 
    private String shapeText = ""; 
    private ButtonGroup buttonGroup = new ButtonGroup(); 

    public ItssRectangle() { 
     RadioBtnListener radioBtnListener = new RadioBtnListener(); 
     JPanel panel = new JPanel(); 
     for (String shape : SHAPES) { 
      JRadioButton rBtn = new JRadioButton(shape); 
      rBtn.setOpaque(false); 
      rBtn.setActionCommand(shape); 
      rBtn.addActionListener(radioBtnListener); 
      panel.add(rBtn); 
      buttonGroup.add(rBtn); 
     } 

     panel.setOpaque(false); 
     setLayout(new BorderLayout()); 
     add(panel, BorderLayout.PAGE_START); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (RECTANGLE.equals(shapeText)) { 
      g.setColor(Color.BLUE); 
      g.fillRect(25, 25, 150, 50); // TODO: Get rid of magic numbers 
     } else if (OVAL.equals(shapeText)) { 
      g.setColor(Color.RED); 
      g.fillOval(25, 80, 100, 100); // TODO: Ditto! 
     } 
    } 

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

    private class RadioBtnListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      shapeText = e.getActionCommand(); 
      repaint(); 
     } 
    } 

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

     JFrame frame = new JFrame("ItssRectangle"); 
     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 для рисования и живописи только. Никакое взаимодействие с пользователем, даже с графическим интерфейсом, не происходит, просто рисуя.

+0

Могу ли я продолжить выполнение кода и повторить ту часть, где высота и ширина заданы в прямоугольнике/овале, и заставить пользователей вводить размеры по своему выбору? – ItssMohammed

Смежные вопросы