Так что в основном у меня есть код, над которым я работал несколько дней назад, что похоже на Paint, что позволяет вам по существу рисовать на экране с помощью мыши. Я как-то обнаружил это свойство случайно, и я понял, что он действительно неэффективен, и мне интересно, есть ли более практичный способ сделать это. Существует на самом деле не какой-либо причине, чтобы дать все мой код, но вот важные частиПростой способ сделать приложение для рисования в java?
private static void createAndShowGui() {
SimpleDraw mainPanel = new SimpleDraw();
MenuBar.createMenuBar();
JLabel label = new JLabel();
label.setText("Drawing prototype 0.0.1");
// label.setHorizontalTextPosition(JLabel.NORTH);
label.setFont(new Font("Serif", Font.BOLD, 20));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.PAGE_AXIS));
frame.setVisible(true);
frame.setJMenuBar(MenuBar.getMenuBar());
frame.setBackground(Color.WHITE);
frame.add(label);
Блок кода выше настраивает JFrame (окно)
@Override
public void mouseDragged(MouseEvent e)
{
// These console outputs are just so that I know what is happening
System.out.println("Event: MOUSE_DRAG");
System.out.println(e.getX());
System.out.println(e.getY());
System.out.println(e.getComponent());
System.out.println(e.getWhen());
System.out.println(e.getButton());
MOUSE_X = e.getX() - 5; //-5 so that the cursor represents the center of the square, not the top left corner.
MOUSE_Y = e.getY() - 5; //^
rect = new Rectangle(MOUSE_X, MOUSE_Y, 10, 10); //This doesn't ever come into action.
repaint();
}
Код выше довольно многое просто устанавливает переменные MOUSE_X и MOUSE_Y и repaint(); метод
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (rect != null) {
if (!colorChoice.equals("Default"))
{
g2.setColor(Color.BLACK);
}
switch(colorChoice) {
case "GRAY":
g2.setColor(Color.GRAY);
break;
case "CYAN":
g2.setColor(Color.CYAN);
break;
case "BLUE":
g2.setColor(Color.BLUE);
break;
case "RED":
g2.setColor(Color.RED);
break;
case "PINK":
g2.setColor(Color.PINK);
break;
case "YELLOW":
g2.setColor(Color.YELLOW);
break;
case "GREEN":
g2.setColor(Color.GREEN);
break;
case "PURPLE":
g2.setColor(Color.MAGENTA);
break;
case "RESET":
g2.setColor(Color.WHITE);
case "WHITE":
g2.setColor(Color.WHITE);
}
g2.fillRect(MOUSE_X, MOUSE_Y, 15, 15);
if (colorChoice.equals("RESET"))
resetColorOnCursor();
}
}
public static void clearBoard()
{
tempColor = colorChoice;
setColorChoice("RESET");
frame.repaint();
}
public static void resetColorOnCursor()
{
setColorChoice(tempColor);
}
Это то, что я случайно встретил. То, что я пытался сделать, когда я это обнаружил, в основном заключалось в том, что квадрат следует за вашим курсором всякий раз, когда вы перемещаете мышь. Но я забыл ввести код paintComponent(g);
, который превращает эту программу в ту вещь, которую я изначально планировал. Нижние части этого - это, по сути, то, как я очистил доску. Я на 100% уверен, что это не правильный способ очистить/сбросить фрейм, как это, но я не мог найти другого пути. Если у кого-то есть какие-либо советы или более эффективные методы для этого, я бы очень благодарен. Благодаря! : D
Нет, вы должны называть 'super.paintComponent', прежде чем рисовать текущее состояние компонента. В противном случае вы могли бы получить всевозможные беспорядки, появляющиеся на вашем компоненте, например, другие призрачные образы вашего компонента, например – MadProgrammer
Чтобы «покоиться» в представлении, оставьте значения, которые определяют, как и что окрашивают, до вызова 'repaint' – MadProgrammer
Вызов super.paintComponent(); делает подвижный квадрат. Это то, чего я НЕ хочу. Я бы не стал более привлекательным. Вызов super.paintComponent(); Вернет эту программу обратно в скучное приложение «подвижный квадрат» –