2016-09-29 8 views
1

Я пишу программу, которая рисует объект в разных состояниях. Первый - это серый прямоугольник, второй - изображение, а третий - более легкий прямоугольник с текстом в нем. Я написал код как 3 класса. У меня проблема с моим классом компонентов. По какой-то причине он продолжает зацикливаться. Когда я вхожу в 1, он отлично работает. Когда я вхожу в 2, он запрашивает мой ввод 4 раза, прежде чем он покажет изображение. Когда я вхожу в 3, он спрашивает дважды, прежде чем он покажет более светлый прямоугольник, но у него нет текста.Мой код, кажется, зацикливается, и я не знаю, почему

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.util.Scanner; 

import javax.swing.JComponent; 

public class ImageComponent extends JComponent { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public int status; 

    public int getInput(){ 
    Scanner userinput = new Scanner(System.in); 
    System.out.println("Select the state <1-rectangle, 2-image, 3-rectangle with text>"); 
    int state=userinput.nextInt(); 
    //userinput.close(); 
    return state; 
    } 

    public void paintComponent(Graphics g){ 
     Graphics2D g2 =(Graphics2D) g; 

     if (getInput() ==1){ 
      ImageMaker rectangle = new ImageMaker(0,0,500,400); 
      g2.setColor(Color.GRAY); 
      rectangle.draw(g2); 

     } 
     else if (getInput() ==2){ 
      Image img1 = Toolkit.getDefaultToolkit().getImage("balloon.gif"); 
      ImageMaker image = new ImageMaker(img1, 0, 0, this); 
      image.draw(g2); 
     } 
     else{ 
      ImageMaker rectangle = new ImageMaker(0,0,500,400); 
      g2.setColor(Color.LIGHT_GRAY); 
      rectangle.draw(g2); 
      g2.drawString("Your Text Here", 500/2, 400/2); 
     } 
    } 

} 
+0

Как вы вызывающие эти методы? –

ответ

3

Я не могу точно сказать точную причину ваших проблем, так как вы не отправил действительный minimal example program (пожалуйста, проверьте ссылку, чтобы увидеть, что я имею в виду), но у меня есть несколько подозрений, что я» буду передавать вам:

  • Вы смешивания сканера инициализируется System.in, инструмент для получения ввода из консоли, с помощью графического интерфейса Swing, две вещи, которые не смешиваются хорошо вместе и не должны хорошо перемешать вместе. Методы ввода сканера блокируют поток программы, что может полностью заморозить ваш графический интерфейс Swing.
  • Вы, кажется, делаете больше вещей в paintComponent, чем вы должны делать. Этот метод предназначен только для рисования и рисования и не должен использоваться для ввода/вывода файлов (например, для чтения на изображениях), для программной логики или для создания компонентов графического интерфейса.
2

Когда я вхожу в 1, он отлично работает. Когда я вхожу в 2, он запрашивает мой ввод 4 раза, прежде чем он покажет изображение. Когда я вхожу в 3, он спрашивает дважды, прежде чем он покажет более светлый прямоугольник, но у него нет текста.

Вы помещаете метод getInput() который запрашивает с помощью сканера в вашем paintComponent. Старайтесь не размещать какие-либо другие вещи в вашем методе paintComponent, кроме задач, связанных с живописью. Менеджер краски решит, когда позвонить самому paintComponent, и у вас нет абсолютного контроля над ним. (Например, его можно вызвать, когда вы изменяете размер/наведите указатель на свой фрейм, в результате чего ваши приглашения будут вызваны больше, чем вы предполагали).

Я бы посоветовал вам отделить вашу логику от запроса пользователя и покраски компонента. Кроме того, вам следует избегать смешивания с помощью сканера с пользовательской покраской.

Вы можете рассмотреть возможность использования Диалоги: How to make Dialogs

0

Первый: Как @ СВП-Full-Of-Угри уже отмечалось: paintComponent для покраски вашего компонента, а не для взаимодействия с пользователем.

Этот метод будет вызываться из качелей в любое время, когда он считает, что необходимо перерисовать свой пользовательский интерфейс - например, после того, как кадр был затенен каким-либо другим окном и снова показан.


Второй момент состоит в том, что

if (getInput() ==1){ 

запрашивает ввод данных пользователем. Если пользователь вводит 2 условие не выполнено, и с

else if (getInput() ==2){ 

вы спрашиваете второй раз для ввода данных пользователя.

Если у вас есть решение цепи, которая зависит от интерактивного пользовательского ввода должен выглядеть как

int input = getInput(); 
if (input == 1) { 
    //... 
} else if (input == 2) { 
    //... 
} else { 
    //... 
} 

или

switch (getInput()) { 
case 1: 
    //... 
    break; 
case 2: 
    //... 
    break; 
default: 
    //... 
    break; 
} 
Смежные вопросы