【问题标题】:JOptionPane Input Dialog during paintComponent in JPanel在JPanel中paintComponent期间的JOptionPane输入对话框
【发布时间】:2013-10-22 17:31:13
【问题描述】:

我在 Netbeans 中使用 Java 来绘制加权二叉树。在 mouseClick 事件中,绘制一个节点,在窗格上的不同点按下和释放鼠标会创建一条边,之后我需要立即弹出一个输入对话框并要求用户输入边的权重。这是我的代码。不过,不要费心浏览整个代码。

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);
    }  
}

问题出现了,每次我点击或拖动时,都会弹出无数个 JOptionPane 输入对话框,我别无选择,只能终止程序。

我没有将那段代码放在任何循环下。但也许是因为它在paintComponent 方法中。 有什么办法可以根除这个问题?或者我可以使用其他方式让用户输入边缘的权重吗?

【问题讨论】:

    标签: java swing graphics binary-tree joptionpane


    【解决方案1】:

    问题出现了,每次我单击或拖动时,都会弹出无数个 JOptionPane 输入对话框

    不要在paintComponent() 方法中显示JOptionPane 对话框。绘画方法仅供绘画。

    选项窗格应显示在 mousePressed 或 mouseReleased 代码上,具体取决于您的具体要求。

    【讨论】:

    • public void mouseReleased(MouseEvent me) { newx[edges]=me.getX(); newy[edges]=me.getY(); edgeWeight[edges] = Integer.parseInt(JOptionPane.showInputDialog("EnterWeightOfEdge:")); repaint(); 然后我把那部分放在 mouseReleased 事件中。现在,即使我单击鼠标,也会出现一个 JOptionPane。它不是无限的,所以它让我输入一个值,但现在我在面板上尝试做的任何事情都会导致 JOptionPane。我不能在上面画任何东西!
    • 那么也许你需要改变你的设计。例如,您可能需要使用鼠标右键弹出一个菜单,其中包含“添加节点”选项。然后该操作将显示选项窗格以获取在单击的点绘制节点所需的信息。
    • 我可以使用文本字段吗?我的意思是,每当我画一条边时,该节点附近就会出现一个文本字段,提示我输入权重……这可行吗?
    • 这与使用 JOptionPane 有何不同?文本字段仍会不断弹出。您的问题在于弹出窗口,而不是您选择显示的组件。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多