在java中绘制线后,ActionListener无法正常工作

时间:2011-10-16 09:37:20

标签: java drawing line jbutton actionlistener

我绘制一条线后有一个动作监听器的问题,基本上它只工作一次,例如,我的应用程序正在下载一个图像,而不是你选择两个点,首先是左键鼠标,第二个是右键,比你点击“连接点”按钮,它正在绘制一条线。这很有用,我可以使用很多行等。但是当我关闭带有图像的窗口并重新加载它时,“连接点”按钮停止工作。 Dk该怎么做。这是代码:

绘画线部分:

public void paint(Graphics g) {

 super.paint(g);
    myPaint(g);  
 }

 private void myPaint(Graphics g) {
    g.drawLine(lx1, ly1, px2, py2);
 }
}

ActionListener部分:

public void actionPerformed(ActionEvent e) {

    if(e.getSource()==painterka){

       Graphics g = imadzysko.getGraphics();
          paint(g);
            lx1=0;
            ly1=0;
            px2=0;
            py2=0;    
       }
 }

带有图形部分的面板:

void diagramKY (JFrame windower, String tyt, String content) {
    Listener listener = new Listener(); 

    panelik.setLayout(null);
    painterka =  new JButton("Connect Points");
    windower = new JFrame("");
    windower.setTitle(tyt+" - diagram");
    windower.setSize(800, 600);
    windower.setVisible(true);
    windower.setLocationRelativeTo(null);
    URLdownloader.fileUrl("http://stooq.pl/c/?s="+content+"&c=1d&t=l&a=lg",
             content+".png","");
    imadzysko = new ImagePanel(new ImageIcon(content+".png").getImage());
    panelik.add(imadzysko);
    panelik.add(painterka);
    imadzysko.addMouseListener(new MyMouseListener());
    painterka.addActionListener(listener);
    Insets insets = panelik.getInsets();
    Dimension size = imadzysko.getPreferredSize();
    imadzysko.setBounds(20 + insets.left, 20 + insets.top,
        size.width, size.height);
    size = painterka.getPreferredSize();
    painterka.setBounds(630 + insets.left, 20 + insets.top,
        size.width, size.height);
    panelik.repaint();
    imadzysko.repaint();
    windower.add(panelik);
好吧,有什么建议吗? :)

2 个答案:

答案 0 :(得分:3)

1)创建面板,将其放入GUI,最后的代码行为

windower.setLocationRelativeTo(null);
windower.setVisible(true);

另外,您的面板永远不会在屏幕上显示

2)不要使用setBounds()等..因为存在LayoutManagers

windower.add(panel);

然后您的面板填充整个JFrame区域

3)永远不要在Swing代码中使用paint(Graphics g),只使用paintComponent(Graphics g)来避免向GUI发送不期望的输出

4)不要在运行时创建新的Top-level Containers,因为弹出窗口只创建一个JDialog或JWindow,并将其重新用于另一个Action

5)你有Concurency in Swing问题,你的GUI冻结,因为等待硬和长时间的代码,实现SwingWorker,有类似的例子

6)如果要显示某些图片或图片,请查找放置在Icon

中的JLabel

7)在发布问题之前确实需要阅读2D Graphics教程

答案 1 :(得分:1)

Graphics g = imadzysko.getGraphics();

永远不要那样做。 Java GUI应该在被告知时进行绘制。到那时,将调用paint(Graphics)paintComponent(Graphics)。那么这幅画。