Цель моего кода - создать прямоугольник при нажатии кнопки. Кнопка работает нормально, но сам прямоугольник не отображается на экране, и ошибок нет. Спасибо за помощь.Java-приложение, создающее Rectangle при нажатии кнопки
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tester {
static JButton button;
static JFrame frame;
static JPanel panel;
static Rectangle rec;
static void init(){
button = new JButton();
frame = new JFrame();
panel = new JPanel();
rec = new Rectangle(30,30,30,30);
button.setVisible(true);
panel.add(button);
frame.add(panel);
frame.setVisible(true);
panel.setVisible(true);
frame.setSize(200, 200);
button.setBackground(Color.GREEN);
button.setBounds(30, 30, 20, 20);
}
public static void main(String[] args) {
init();
ActionListener listener = new RectangleMover();
button.addActionListener(listener);
}
static class RectangleMover implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
RectanglePainter r = new RectanglePainter();
r.add(rec);
}
}
static class RectanglePainter extends JPanel{
void add(Rectangle r){
rec = r;
repaint();
}
protected void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
Random r = new Random();
int i =r.nextInt(2);
if (i==1)
g2.setColor(Color.BLUE);
else
g2.setColor(Color.RED);
g2.fill(rec);
g2.draw(rec);
}
}
}
Хорошо, ваш обычно подход не рекомендуется использовать 'JComponent' как« форму », вы должны добавлять фигуры в' JComponent', которые нарисованы с помощью метода 'paintComponent' – MadProgrammer
Привет, я не совсем понимаю, как я использую JComponent как форма. Как бы вы порекомендовали меня изменить код, чтобы не использовать его как форму, но добавлять к нему фигуры? –
Итак, каждый раз, когда вы нажимаете кнопку, вы создаете новый экземпляр «ShapeChanger», который является компонентом. Хотя вы можете это сделать, вы игнорируете тот факт, что менеджер макета ('BorderLayout' в этом случае) в любом случае не выложит его. Лучшим решением было бы сделать один компонент, который может рисовать несколько фигур, как показано в моем ответе – MadProgrammer