Проблема с Scanner

178
10 августа 2018, 21:50

Такая проблема, хочу, чтобы при нажатии клавиши объект "gena" перемещался в следующую клетку. После создания переменной типа int со сканнером Scanner scn = new Scanner(System.in); int i = scn.nextInt(); весь фрейм покрывается черным цветом и закрывается только через диспетчер задач. Как избежать этого?

import java.awt.*;
import java.awt.event.*;
 import java.awt.geom.*;
import java.util.TimerTask;
import java.util.Timer;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.*;
public class main {
public static void main(String args[])
{
    JFrame frame = new DrawFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);    
        frame.setSize(805, 830);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setTitle("Gena");
}
}
class DrawFrame extends JFrame
{
public DrawFrame() 
{
    add(new DrawComponent());
    pack();
}
}
class DrawComponent extends JComponent
{
public void paintComponent(Graphics g)
{   
    Graphics2D g2 = (Graphics2D) g;
    int xWhite = 0;
    int yWhite = 0;
    int widthWhite = 800;
    int heightWhite = 800;
    int blackWidth = 100;
    int blackHeight = 100;
    Rectangle2D whiteScreen =
                new Rectangle2D.Double(xWhite, yWhite, widthWhite, 
heightWhite);
    g2.setColor(Color.WHITE);
    g2.fill(whiteScreen);
    g2.draw(whiteScreen);
    for(int q = 0; q<4; q++)
    {
        for(int i = 0; i<4; i++)
        {
        Rectangle2D black = 
                new Rectangle2D.Double(xWhite, yWhite, blackWidth, 
blackHeight);
        g2.setColor(Color.BLACK);
        g2.fill(black);
        g2.draw(black);
        xWhite = xWhite + 200;
        }
        xWhite = 0;
        yWhite = yWhite + 200;
    }
        xWhite = 100;
        yWhite = 100;
    for(int q = 0; q<4; q++)
    {
        for(int i = 0; i<4; i++)
        {
            Rectangle2D black = 
                    new Rectangle2D.Double(xWhite, yWhite, blackWidth, 
blackHeight);
            g2.setColor(Color.BLACK);
            g2.fill(black);
            g2.draw(black);
            xWhite = xWhite + 200;
        }
            xWhite = 100;
            yWhite = yWhite + 200;
    }
    int genaX = 25;
    int genaY = 725;
    int genaWidth = 50;
    int genaHeight = 50;

    Scanner scn = new Scanner(System.in);
    int u = scn.nextInt();
    if(u==8)
    {
        g2.clearRect(genaX, genaY, genaWidth, genaHeight);
        genaY = 675;
        Rectangle2D gena = 
                new Rectangle2D.Double(genaX, genaY, genaWidth, genaHeight);
        g2.setColor(Color.ORANGE);
        g2.fill(gena);
        g2.draw(gena);
    }
    for(int i = 0; i<13; i++)
    {
    Rectangle2D gena = 
            new Rectangle2D.Double(genaX, genaY, genaWidth, genaHeight);
    g2.setColor(Color.ORANGE);
    g2.fill(gena);
    g2.draw(gena);
    }
}

}

Answer 1

Вы не можете использовать сканер для ввода значений в paintComponent(). Поскольку этот метод вызывается контейнером для того чтобы рисовать внутри окна компонента. И метод nextInt() прерывает выполнение программы для ввода следующего значения с консоли.

Есть два вида приложений на Java - одно консольное, другое GUI приложение. В первом случае у вас ничего нет кроме коммандной строки для ввода вывода. Во втором случае вы можете использовать компоненты, которые позволяют вводить и отображать вводимые в них значения, такие как JTextField.

При нажатии на клавишу, генерируется событие клавиатуры. Вы можете создать слушателя клавиатуры в вашем компоненте или родительском компоненте и тогда вам придется обрабатывать каждое нажатие клавиши для определения кода нажатой клавиши и вычисления значения.

READ ALSO
Вывод символа из слова в консоли

Вывод символа из слова в консоли

Помогите написать программу ,которая будет запускаться из терминала или консолиОна должна брать данные из строки запуска программы:

188
Класс CellRangeAddress библиотека POI

Класс CellRangeAddress библиотека POI

При записи в файл Excel воспользовался классом объединения ячеек CellRangeAddressВ объединенные ячейки было добавлено повторное значение:

143
MariaDB не берет текст на русском

MariaDB не берет текст на русском

Работаю с mariaDB из программы на JavaПри попытке ввода русских символов бросается исключение java

171
Java объединение WAV-файлов

Java объединение WAV-файлов

У меня есть метод, который объединяет несколько wav файлов в один:

164