Java 在JPanel中绘制组件期间的JOptionPane输入对话框
我在Netbeans中使用Java来绘制加权二叉树。在mouseClick事件中,会绘制一个节点,在窗格上的不同点按下并释放鼠标会创建一条边,然后我需要弹出一个输入对话框,要求用户输入边的重量。这是我的密码。不过,不要费心通读整个代码Java 在JPanel中绘制组件期间的JOptionPane输入对话框,java,swing,graphics,binary-tree,joptionpane,Java,Swing,Graphics,Binary Tree,Joptionpane,我在Netbeans中使用Java来绘制加权二叉树。在mouseClick事件中,会绘制一个节点,在窗格上的不同点按下并释放鼠标会创建一条边,然后我需要弹出一个输入对话框,要求用户输入边的重量。这是我的密码。不过,不要费心通读整个代码 public class panel1 extends JPanel implements MouseListener,ActionListener { nodeClass[] nodes = new nodeClass[20]; int nod
public class panel1 extends JPanel implements MouseListener,ActionListener
{
nodeClass[] nodes = new nodeClass[20];
int nodeRadius = 10;
int ctr = 0;
int[] x=new int[100];
int[] y=new int[100];
int[] oldx=new int[100];
int[] oldy=new int[100];
int[] newx=new int[100];
int[] newy=new int[100];
int edges=0;
int[] edgeWeight = new int[100];
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.GREEN);
if(x[ctr]!=0&&y[ctr]!=0)
{
for(int i=0;i<=ctr;i++){
g.setColor(Color.GREEN);
g.fillOval(x[i]-25, y[i]-45, 40, 40);
g.setColor(Color.BLACK);
g.drawString(String.valueOf(i+1),x[i]-10,y[i]-25);
}
for(int i=0;i<edges;i++){
g.setColor(Color.GREEN);
g.drawLine(oldx[i]-10,oldy[i]-30,newx[i]-10,newy[i]-30);
g.drawString(String.valueOf(edgeWeight[i]), (oldx[i]+newx[i])/2, (oldy[i]+newy[i])/2);
}
ctr++;
}
if(oldx[edges]!=0&&oldy[edges]!=0&&newx[edges]!=0&&newy[edges]!=0&&(newx[edges]!=oldx[edges] && newy[edges]!=oldy[edges]))
{
edgeWeight[edges] = Integer.ParseInt(JOptionPane.showInputDialog("Enter Weight Of Edge : "));
for(int i=0;i<ctr;i++){
g.setColor(Color.GREEN);
g.fillOval(x[i]-25, y[i]-45, 40, 40);
g.setColor(Color.BLACK);
g.drawString(String.valueOf(i+1),x[i]-10,y[i]-25);
}
for(int i=0;i<=edges;i++){
g.setColor(Color.GREEN);
g.drawLine(oldx[i]-10,oldy[i]-30,newx[i]-10,newy[i]-30);
g.drawString(String.valueOf(edgeWeight[i]), (oldx[i]+newx[i])/2, (oldy[i]+newy[i])/2);
}
edges++;
}
}
@Override
public void mouseClicked(MouseEvent me) {
x[ctr]=me.getX();
y[ctr]=me.getY();
repaint();
}
@Override
public void mousePressed(MouseEvent me) {
oldx[edges]=me.getX();
oldy[edges]=me.getY();
}
@Override
public void mouseReleased(MouseEvent me) {
newx[edges]=me.getX();
newy[edges]=me.getY();
repaint();
}
@Override
public void mouseEntered(MouseEvent me) {;
}
@Override
public void mouseExited(MouseEvent me) {;
}
@Override
public void actionPerformed(ActionEvent ae) {
String str=ae.getActionCommand();
System.out.println(str);
}
}
公共类panel1扩展了JPanel实现了MouseListener、ActionListener
{
nodeClass[]节点=新的nodeClass[20];
int nodeRadius=10;
int ctr=0;
int[]x=新的int[100];
int[]y=新的int[100];
int[]oldx=新int[100];
int[]旧的=新的int[100];
int[]newx=新int[100];
int[]newy=新int[100];
int边=0;
int[]Edgewight=新int[100];
@凌驾
公共组件(图形g)
{
超级组件(g);
g、 setColor(Color.GREEN);
如果(x[ctr]!=0和&y[ctr]!=0)
{
对于(int i=0;i
问题是,每次我单击或拖动时,都会弹出无限多个JOptionPane输入对话框
不要在paintComponent()方法中显示JOptionPane对话框。绘制方法仅用于绘制
选项窗格应显示在您的mousePressed或mouseReleased代码上,具体取决于您的具体要求。public void mouseReleased(MouseEvent me){newx[edges]=me.getX();newy[edges]=me.getY();EdgeWight[edges]=Integer.parseInt(JOptionPane.showInputDialog(“EnterWeightOfEdge:);repaint())
我当时将该部分放在MouseRelease事件中。现在,即使我单击鼠标,也会显示一个JOptionPane。它不是无限的,所以它允许我输入一个值,但现在我尝试在面板上执行的任何操作都会导致一个JOptionPane。我无法在它上绘制任何东西!然后可能需要更改设计。例如,可能需要使用鼠标右键按钮弹出一个包含选项“添加节点”的菜单。然后,该操作将显示选项窗格,以获取在单击点绘制节点所需的信息。我可以使用文本字段吗?我的意思是,每当我绘制边时,该节点附近会出现一个文本字段,提示我输入权重…这是否可行?这与使用JOptionPane有何区别?文本字段仍将持续显示弹出窗口。您的问题在于弹出窗口,而不是您选择显示的组件。