1

JPanelでグラフィックを描きたいです。現在、私が行っているのは、paintComponentメソッドを使用して図面を定義することです。

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

次に、グラフィックを配置したい場所でrepaint()を呼び出します。

しかし、このpaintComponentメソッドを使用せずにコンポーネントを追加するのと同じようにグラフィックをJPanelに追加する方法があるのだろうか:panel.add(myComponent)。グラフィックスタイプを開始できないことはわかりましたが、それを可能にする別のタイプがあるかもしれません。

FANG Engineなどの多くのGUIにこのオプションがあることは確かですが、Swingで見たすべての例はこの方法を使用していました。これなしで行うための提案はありますか?それは時々私のプログラムの全体的なデザインを台無しにしているからです。

前もって感謝します。

4

4 に答える 4

4

最も簡単な方法は、ペイントを担当するカスタムアイコンオブジェクトを作成することです。次に、JLabelを介してアイコンをパネルに追加(またはボタンやアイコンを取得するその他のコンポーネントに配置)しながら、ペイント作業を抽象化できます。

于 2011-07-13T16:02:42.143 に答える
3

画像とバッファリングされた画像APIを確認できます。バッファリングされた画像は、paintcomponentとグラフィックス以外のさまざまな方法で生成および処理できます。バッファリングされた画像を生成してからJPanelにロードすると、同様の効果が得られると思います。setRGBメソッドを使用して、必要なものをペイントできます。ペイント方法ほど用途が広いわけではありませんが、代替手段です。

于 2011-07-13T16:11:49.297 に答える
1

アイデアは、すべてのカスタムペイントを個々の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...
    }
}

もちろん、これにより動的性が大幅に低下します...

編集:

分離について言えば、画面をたとえば2つの部分に分割したい場合:1つはカスタムペイント用で、もう1つはコンポーネント用、たとえばゲーム用です。このソリューションはニーズに合うはずです...

于 2011-07-14T12:17:37.323 に答える
0
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() {
    }
}
于 2011-07-13T17:06:44.280 に答える