I am currently imlementing a simple GUI interface to interact with a Lego Mindstorm NXT. My current issue resides with a paint issue on my interface. When my MainUI loads it calls a method called GirdPanel() which sets up my GridPanel. The MainUI, which extends JFrame, then adds this panel to it's JFrame calling. Here is the full code for MainUI that matters for this problem.
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);
}
The WGraph is my class that extends JPanel and controls the graphing display for this program.
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;
}
}
So after all that I can describe my problem. The problem is with the graphing panel it will not show up when expected too. I am trying to determine why. Currently when the program loads it appears like this. LINK1 It simple doesn't show the graph at all but when I drop down the JComboBox it appears. LINK2 It also reamins when the JComboBox has an item selected and closes. LINK3 However it disappears again when you try to interact with it. LINK4 in comments
Does anybody see any visible error in my JFrame or JPanel construction? Do you have any suggestions to help me figure out what is going on?
Side note: The Paint function is called three times when the frame first loads. Once more when JComboBox opens. Once more when JComboBox closes. And finally more times when trying to ineract with the graph by clicking on it.
Why are you using this line Graphics pg = panel.getGraphics();
and using the pg
object for drawing points on panel? Why not create another class that extends JPanel
and override its paintComponent
method to draw all the required points , and then add the object of that overriding Jpanel class to WGraph panel ?.
For example consider the code give below:
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);
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.