Рисование прямоугольников на JPanel
У меня есть JScrollPane, и поверх него у меня есть JPanel с именем 'panel1'. Я хочу, чтобы на этой JPanel были нарисованы несколько прямоугольников.
У меня есть класс с именем DrawRectPanel, который расширяет JPanel и делает все вещи для рисования. Проблема в том, что я попытался нарисовать прямоугольники на панели 1, написав следующий код:
panel1.add(new DrawRectPanel());
но ничего не появилось на panel1, тогда я попытался, просто как тест для класса DrawRectPanel:
JFrame frame = new JFrame();
frame.setSize(1000, 500);
Container contentPane = frame.getContentPane();
contentPane.add(new DrawRectPanel());
frame.show();
Это сработало и создало рисунки, но на отдельном JFrame. Как я могу нарисовать прямоугольники на панели1? Заранее спасибо.
РЕДАКТИРОВАТЬ: код для DrawRectPanel
public class DrawRectPanel extends JPanel {
DrawRectPanel() {
Dimension g = new Dimension(400,400);
this.setPreferredSize(g);
System.out.println("label 1");
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("label 2");
g.setColor(Color.red);
g.fillRect(20, 10, 80, 30);
}
}
только этикетка 1 напечатана на экране
3 ответа
До сих пор не знаю,
например
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class CustomComponent extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent() {
setTitle("Custom Component Graphics2D");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void display() {
add(new CustomComponents());
pack();
// enforces the minimum size of both frame and component
setMinimumSize(getSize());
setVisible(true);
}
public static void main(String[] args) {
CustomComponent main = new CustomComponent();
main.display();
}
}
class CustomComponents extends JComponent {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
}
Вместо добавления
contentPane.add(new DrawRectPanel());
ты должен сделать
contentPane.add(panel1);
Потому что у вас уже есть новый DrawRectPanel
в панели1. Но в вашем коде вы добавляете еще один экземпляр DrawRectPanel
в contentPane
, И никогда не добавлял panel1
ни в одном из ваших container
,
Чтобы исправить вашу проблему, измените "paintComponent" на "paint", когда окно перерисовывается автоматически, оно должно работать.