Такая проблема, хочу, чтобы при нажатии клавиши объект "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);
}
}
}
Вы не можете использовать сканер для ввода значений в paintComponent()
. Поскольку этот метод вызывается контейнером для того чтобы рисовать внутри окна компонента. И метод nextInt()
прерывает выполнение программы для ввода следующего значения с консоли.
Есть два вида приложений на Java - одно консольное, другое GUI приложение. В первом случае у вас ничего нет кроме коммандной строки для ввода вывода. Во втором случае вы можете использовать компоненты, которые позволяют вводить и отображать вводимые в них значения, такие как JTextField
.
При нажатии на клавишу, генерируется событие клавиатуры. Вы можете создать слушателя клавиатуры в вашем компоненте или родительском компоненте и тогда вам придется обрабатывать каждое нажатие клавиши для определения кода нажатой клавиши и вычисления значения.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Помогите написать программу ,которая будет запускаться из терминала или консолиОна должна брать данные из строки запуска программы:
При записи в файл Excel воспользовался классом объединения ячеек CellRangeAddressВ объединенные ячейки было добавлено повторное значение:
Работаю с mariaDB из программы на JavaПри попытке ввода русских символов бросается исключение java