Рисование графики на JPanel без использования метода PaintComponent и повторного вызова - PullRequest
1 голос
/ 13 июля 2011

Я хочу нарисовать графику на JPanel. Сейчас я использую метод paintComponent для определения чертежа:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillRect(10,10,100,100);
}

Затем я вызываю repaint () везде, где я хочу разместить графику.

Но мне интересно, есть ли способ добавить Graphics в JPanel так же, как добавление компонентов без использования этого метода paintComponent: panel.add (myComponent). Я видел, что тип Graphics не может быть инициирован, но, возможно, может быть другой тип, позволяющий мне это сделать.

Я почти уверен, что во многих графических интерфейсах, таких как FANG Engine, есть эта опция, но все примеры, которые я видел с Swing, использовали этот метод. Любые предложения обойтись без этого? Потому что это иногда портит общий дизайн моей программы.

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Самый простой способ - создать пользовательский объект Icon , отвечающий за вашу картину. Затем вы можете добавить свой значок на панель с помощью JLabel (или поместить его на кнопку или любой другой компонент, использующий значки), одновременно абстрагируя от рисования.

3 голосов
/ 13 июля 2011

Вы можете взглянуть на изображение и буферизованное изображение apis.Вы можете создавать и обрабатывать буферизованные изображения разными способами, кроме рисования и графики g.Я предполагаю, что если вы сгенерируете буферизованные изображения, а затем загрузите их на свой JPanel, вы сможете получить аналогичный эффект.Вы можете использовать метод setRGB, чтобы нарисовать то, что вы хотите.Он не так универсален, как метод рисования, но является альтернативой.

0 голосов
/ 14 июля 2011

Идея заключалась бы в том, чтобы поместить каждую пользовательскую картину в отдельный JPanel, а затем добавить это.

public class MyFrame extends JFrame {
    //initialize frame...
    //put your components

    //now put your jpanel
    MyPanel custom = new MyPanel();
    custom.setBounds(10, 10, 100, 100);

    this.add(custom);
}

public class MyPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //draw your stuff...
    }
}

Конечно, это сделало бы ее намного менее динамичной ...

РЕДАКТИРОВАТЬ:

Говоря о разделении, если вы хотите разделить экран, например, на две части: одну для пользовательской рисования и одну для компонентов, например, для игры, то это решение должно соответствовать вашим потребностям..

0 голосов
/ 13 июля 2011
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        JPanel viewportPanelTop = new JPanel();
        JPanel viewportPanelBottom = new JPanel();
        JPanel viewportPanelCenter = new JPanel();
        viewportPanelCenter.setBackground(Color.black);
        viewportPanelCenter.setPreferredSize(new Dimension(600, 400));
        JPanel viewportPanelWest = new JPanel();
        JPanel viewportPanelEast = new JPanel();

        JFrame frame = new JFrame();
        frame.setTitle("JFrame");
        frame.setLocation(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(viewportPanelTop, BorderLayout.NORTH);
        frame.add(viewportPanelWest, BorderLayout.WEST);
        frame.add(viewportPanelCenter, BorderLayout.CENTER);
        frame.add(viewportPanelEast, BorderLayout.EAST);
        frame.add(viewportPanelBottom, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private Main() {
    }
}
...