【发布时间】:2013-10-21 22:08:55
【问题描述】:
我是 Java 新手。我正在尝试使用 GUI 输入和显示加权二叉树。要创建根节点,用户单击屏幕。随后,他从一个点拖动到另一个点以创建一条边和一个新节点。松开鼠标后,应提示他输入权重,然后应显示边缘(显示权重)和新节点。
在输入中,虽然我能够创建根,但当我尝试拖动以创建下一个节点时,程序进入循环。
代码如下。
class myPanel extends JPanel implements MouseListener, MouseMotionListener
{
int node_is_present[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //1 if node exists, 0 otherwise
int no_of_nodes=0;
int node_coords[][]=new int[15][2]; //stores co-ordinates of each node
int weight[]=new int[15]; //stores weight of line in the order entered
int x1,x2,y1,y2;
int tracker=-1;
int SIZE=20;
public void clear()
{
x1=0;
y1=0;
x2=0;
y2=0;
}
@Override
public void mouseClicked(MouseEvent me) {}
@Override
public void mousePressed(MouseEvent me) //will store intial x,y
{
tracker=1;
x1=me.getX();
y1=me.getY();
repaint();
}
@Override
public void mouseReleased(MouseEvent me) //will store final x,y and update arrays
{
x2=me.getX();
y2=me.getY();
if(x1!=x2)
tracker=2;
node_is_present[no_of_nodes]=1;
node_coords[no_of_nodes][0]=me.getX();
node_coords[no_of_nodes][1]=me.getY();
no_of_nodes++;
repaint();
}
@Override
public void mouseEntered(MouseEvent me){}
@Override
public void mouseExited(MouseEvent me) {}
@Override
public void mouseDragged(MouseEvent me){}
@Override
public void mouseMoved(MouseEvent me) {}
public void paintComponent(Graphics g)
{
if(tracker==1 && no_of_nodes==0) //for root node
{
g.drawOval(x1-(SIZE/2),y1-(SIZE/2),SIZE,SIZE);
g.drawString(String.valueOf(no_of_nodes+1),x1-(SIZE/2),y1-(SIZE/2));
}
else if(tracker==2 && no_of_nodes>0)
{
g.drawLine(x1 -(SIZE/2) , y1 -(SIZE/2) , x2 -(SIZE/2) , y2 -(SIZE/2));
g.drawOval(x2-(SIZE/2),y2-(SIZE/2),SIZE,SIZE);
g.drawString(String.valueOf(no_of_nodes+1),x2-(SIZE/2),y2-(SIZE/2));
String str=JOptionPane.showInputDialog("Enter the weight of the edge: ");
int w=Integer.parseInt(str);
weight[no_of_nodes-1]=w;
g.drawString(String.valueOf(w),Math.round((x1+x2)/2),Math.round((y1+y2)/2));
clear();
}
}
myPanel()
{
this.setSize(1500, 500);
addMouseListener(this);
addMouseMotionListener(this);
clear();
}
}
public class tree1
{
public static void main(String[] args) {
JFrame frame=new JFrame();
myPanel panel=new myPanel();
frame.setSize(1500, 800);
frame.setLocation(0, 0);
frame.setTitle("Tree");
frame.setBounds(100,100,1500,800);
frame.add(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
【问题讨论】:
-
$有什么用?此外,您的paintComponent(...)方法似乎包含程序逻辑——clear()。这不应该。考虑创建并发布sscce 来展示您的问题。另外,请记住将这个大问题分解为小问题,在尝试将所有问题结合起来之前,先解决每个较小的简单问题。 -
$ - 格式问题,已修复。 clear() 不是paintcomponent 的一部分——它是上面定义的一个单独的函数,它将所有坐标的值重置为0。
-
我知道,但你是从 withinpaintComponent 调用它的。同样,不要这样做,因为您无法完全控制是否调用paintComponent。
-
hovercraftfullofeels 的担忧是您无法控制喷漆过程,喷漆可能出于多种原因,其中很多是您无法控制的。更多详情请关注Performing Custom Painting
标签: java swing jpanel paintcomponent mouselistener