0

現在、レゴ マインドストーム NXT と対話するためのシンプルな GUI インターフェイスを実装しています。現在の問題は、インターフェイスのペイントの問題にあります。MainUI が読み込まれると、GridPanel を設定する GirdPanel() というメソッドが呼び出されます。JFrame を拡張する MainUI は、このパネルを JFrame の呼び出しに追加します。この問題に関係する MainUI の完全なコードを次に示します。

  public MainUI(){
    setSize(700, 600);

    PathPanel pathPanel = new PathPanel(controller);
    add(pathPanel, BorderLayout.WEST);
    CurrentPath.getInstance().addPathDataListener(pathPanel);
    CurrentPath.getInstance().addPointSelectionListener(pathPanel);

    gridPanel();
    add(gridPanel, BorderLayout.CENTER);


    robotControlBar();
    add(robotControls, BorderLayout.NORTH);

    setJMenuBar(menuPanel());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}

public void gridPanel(){
    gridPanel = new JPanel(new BorderLayout());
    WGraph graph = new WGraph();

    gridPanel.add(graph, BorderLayout.CENTER);

}

WGraph は、JPanel を拡張し、このプログラムのグラフ表示を制御する私のクラスです。

public class WGraph extends JPanel{

public WGraph(){
    //WGraph Panel property setup
    setLayout(new BorderLayout());
    //Variable creation
    points = new ArrayList<Dot>();
    //Label to display coordinates of selected point
    pointDisplay = new JLabel("Selected point at: None Chosen");

    //testPoints(); //Comment Out when test dots not needed.

    //Create Graph Panel
    panel = new JPanel();
    panel.setBackground(PANEL_COLOR);

    //Mouse Listeners for Panel
    MouseEventHandler mouseListener = new MouseEventHandler();
    panel.addMouseListener(mouseListener);
    panel.addMouseMotionListener(mouseListener);


    //Adding components to the WGraph panel
    add(pointDisplay, BorderLayout.NORTH);
    add(panel, BorderLayout.CENTER);

    repaint();
}
public void paintComponent(Graphics g){
    // invokes default painting for JFrame; must have this!
    super.paintComponent(g); 

    // paint on the canvas rather than the JFrame
    Graphics pg = panel.getGraphics(); 
    System.out.println("*"); //Print out to see when repaint has been called. for testing only
    int width = panel.getWidth();
    int height = panel.getHeight();
    pg.setColor(GRID_COLOR);

    for (int i = 50; i < width; i+=50) {
        pg.drawLine(i, 0, i, height);
    }

    for (int i = 50; i < width; i+=50) {
        pg.drawLine(0, i, width, i);
    }

    Dot previousPoint = null;

    for (int i = 0; i < points.size(); i++) {
        Dot currentPoint = points.get(i);
        currentPoint.draw(pg);

        if (previousPoint != null) {
            pg.setColor(Dot.DESELECTED_COLOR);
            pg.drawLine(new Float(previousPoint.getCenter().x).intValue(), 
                    new Float(previousPoint.getCenter().y).intValue(), 
                    new Float(currentPoint.getCenter().x).intValue(), 
                    new Float(currentPoint.getCenter().y).intValue());
        }

        previousPoint = currentPoint;
    }
}

結局のところ、私は自分の問題を説明できます。問題は、グラフ パネルが期待どおりに表示されないことです。その理由を特定しようとしています。現在、プログラムをロードすると、このように表示されます。LINK1単純にグラフがまったく表示されませんが、JComboBoxをドロップダウンすると表示されます。LINK2 また、JComboBox でアイテムが選択されて閉じられたときにも鳴ります。LINK3 しかし、操作しようとするとまた消えてしまいます。コメントのLINK4

JFrame または JPanel の構築で目に見えるエラーが表示される人はいますか? 何が起こっているのかを理解するのに役立つ提案はありますか?

補足: Paint 関数は、フレームが最初に読み込まれるときに 3 回呼び出されます。JComboBox が開いたらもう一度。JComboBox が閉じるときにもう一度。そして最後に、グラフをクリックしてグラフを操作しようとしたときの回数が増えました。

4

1 に答える 1

2

なぜこの線Graphics pg = panel.getGraphics();を使用し、pgオブジェクトをパネル上の点の描画に使用するのですか? そのメソッドを拡張JPanelおよびオーバーライドしpaintComponentて必要なすべてのポイントを描画する別のクラスを作成し、そのオーバーライドする Jpanel クラスのオブジェクトを WGraph パ​​ネルに追加してみませんか?

たとえば、以下のコードを考えてみましょう。

import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class MyFrame extends JFrame implements ActionListener
{
    private JComboBox jcbShape;
    private WGraph jpGraph;
    public MyFrame()
    {
        super("GridFrame");
    }
    public void prepareGUI()
    {
        Object[] items= {"Line","Rectangle","Circle"};
        jcbShape = new JComboBox(items);
        jpGraph = new WGraph();
        Container container = getContentPane();
        container.add(jpGraph);
        container.add(jcbShape,BorderLayout.NORTH);
        jcbShape.addActionListener(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,400);
    }
    @Override
    public void actionPerformed(ActionEvent evt)
    {
        String sShape = (String)jcbShape.getSelectedItem();
        jpGraph.setShape(sShape);
    }
    public static void main(String[] st)
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                MyFrame myFrame = new MyFrame();
                myFrame.prepareGUI();
                myFrame.setVisible(true);
            }
        });
    }
}
class WGraph extends JPanel
{
    private String sShape = "Line";
    public void setShape(String shape)
    {
        sShape = shape;
        repaint();
    }
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if ("Line".equalsIgnoreCase(sShape))
        {
            g.drawLine(10, 20, 100, 200);
        }
        else if ("Circle".equalsIgnoreCase(sShape))
        {
            g.drawOval(50, 100 , 200, 200);
        }
        else if ("Rectangle".equalsIgnoreCase(sShape))
        {
            g.drawRect(10, 20, 150, 200);
        }
    }
}
于 2013-01-24T19:01:53.573 に答える