我目前正在实施一个简单的 GUI 界面来与 Lego Mindstorm NXT 进行交互。我当前的问题在于我的界面上的油漆问题。当我的 MainUI 加载时,它会调用一个名为 GirdPanel() 的方法来设置我的 GridPanel。MainUI 扩展了 JFrame,然后将此面板添加到它的 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 关闭时再一次。最后是更多次尝试通过单击图表来与图表互动。