Я предполагаю, что вы пытаетесь нарисовать JPanel, а затем ожидаете, что JPanel должен увеличиться, чтобы вместить ваш чертеж, и это не только не работает для вас, но и вы теряете чертеж, если вы вызываете Перекрасить () на JPanel.
Если так, то
- Тот факт, что вы рисуете за пределы размера JPanel или другого JComponent, не будет автоматически увеличивать этот компонент, поскольку сам компонент не знает, что вы рисуете за его пределами. Если вы хотите изменить размер компонента, вы должны сделать это самостоятельно.
- Лучше всего, чтобы JPanel установил свой собственный размер, переопределив свой метод
getPreferredSize()
. Это не позволит другому коду сбросить свой размер на что-то другое.
- Вы не хотите получать графику компонента, вызывая
getGraphics()
для него. Полученный таким образом объект Graphics работает недолго, и все нарисованное исчезнет, как только в следующий раз будет вызван paint (...) или paintComponent (). Можно вызывать getGraphics () для BufferedImage, но не для Component или JComponent (если у вас нет для этого веских оснований и вы знаете, как защитить объект Graphics от нуля).
- Переопределите JPanel или какой-либо другой JComponent и нарисуйте метод переопределения
paintComponent(...)
этого компонента. Если вы используете BufferedImage, то вы рисуете BufferedImage в этом методе paintComponent.
Например:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class TestDrawing extends JPanel {
private static final int PREF_W = 800;
private static final int PREF_H = 600;
private DrawingPanel drawingPanel = new DrawingPanel();
public TestDrawing() {
JPanel northPanel = new JPanel();
northPanel.add(new JButton(new AbstractAction("Draw Lines") {
@Override
public void actionPerformed(ActionEvent arg0) {
drawingPanel.drawLines();
drawingPanel.repaint();
}
}));
setLayout(new BorderLayout());
add(new JScrollPane(drawingPanel));
add(northPanel, BorderLayout.PAGE_START);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
TestDrawing mainPanel = new TestDrawing();
JFrame frame = new JFrame("TestDrawing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class DrawingPanel extends JPanel {
private static final int BI_W = 500;
private static final int FLOOR = 22;
private static final int FLO_H = 100;
private BufferedImage img = new BufferedImage(BI_W, FLO_H * FLOOR, BufferedImage.TYPE_INT_ARGB);
public DrawingPanel() {
}
public void drawLines() {
Graphics g = img.getGraphics();
g.setColor(Color.black);
for (int i = 0; i < FLOOR; i++) {
g.drawLine(0, i * FLO_H, 300, i * FLO_H);
g.setColor(Color.RED);
}
g.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(BI_W, FLO_H * FLOOR);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
}
}
}