2015-02-10 86 views
1

我有一個程序,基本上只是應該在您的光標進入JPanel上顯示的多邊形時更改標籤的文本。我已經嘗試了幾件不同的事情,沒有任何工作。目前,我正在嘗試使用if語句來選擇要添加的按鈕,但如果將光標移動到多邊形中,它仍然不會更改。當光標位於多邊形之外時,標籤應該說「點不在多邊形中」,並且在它內部應該說「點在多邊形中」。任何幫助將不勝感激。如何根據光標位置改變幀中的文本?

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class Chapter3Lab1 extends JFrame{ 

private RegularPolygonPanel canvas = new RegularPolygonPanel(); 

public Chapter3Lab1() 
{ 

    JPanel panel = new JPanel(); 


    add(canvas, BorderLayout.CENTER); 
    add(panel, BorderLayout.SOUTH); 


    canvas.setFocusable(true); 
    canvas.requestFocusInWindow(); 



} 


public static void main (String[] args) 
{ 

    String isInside = "The point is in the polygon"; 
    String notInside = "The point is not in the polygon"; 


    //Create a Polygon object 
    Polygon polygon = new Polygon(); 

    polygon.addPoint(40,20); 
    polygon.addPoint(70,40); 
    polygon.addPoint(60,80); 
    polygon.addPoint(45,45); 
    polygon.addPoint(20,60); 


    JLabel label = new JLabel(isInside, JLabel.CENTER); 
    JLabel notlabel = new JLabel(notInside, JLabel.CENTER); 

    Chapter3Lab1 frame = new Chapter3Lab1();; 
    frame.setTitle("Chapter 3 Lab 1"); 
    frame.setLayout(new FlowLayout()); 
    frame.setLocationRelativeTo(null);// Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(200,200); 
    while (true) 
    { 
     PointerInfo a = MouseInfo.getPointerInfo(); 
     Point b = a.getLocation(); 
     int x = (int) b.getX(); 
     int y = (int) b.getY(); 
     if(polygon.contains(x, y) == false) 
     { 
     frame.remove(label); 
     frame.add(notlabel); 
     } 
     else 
     { 
     frame.remove(notlabel); 
     frame.add(label); 
     } 

     frame.setVisible(true); 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 



} 

class RegularPolygonPanel extends JPanel 
{ 




    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     //Create a Polygon object 
     Polygon polygon = new Polygon(); 

     polygon.addPoint(40,20); 
     polygon.addPoint(70,40); 
     polygon.addPoint(60,80); 
     polygon.addPoint(45,45); 
     polygon.addPoint(20,60); 

     //Draw the polygon 
     g.drawPolygon(polygon); 
    } 

    public Dimension getPreferredSize() 
    { 
     return new Dimension(200,200); 
    } 
} 
} 

回答

1

開始採取看看How to Write a Mouse Listener

您需要保持對Polygon對象的引用,並利用它的contains方法,以確定是否鼠標是Polygon本身...

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private RegularPolygonPanel polyPanel; 
     private JLabel label; 

     public TestPane() { 
      polyPanel = new RegularPolygonPanel(); 
      polyPanel.addMouseMotionListener(new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        if (polyPanel.isWithinPolygon(e.getPoint())) { 
         label.setText("Is inside"); 
        } else { 
         label.setText("Is outside"); 
        } 
       } 
      }); 
      label = new JLabel("..."); 
      setLayout(new BorderLayout()); 
      add(polyPanel); 
      add(label, BorderLayout.SOUTH); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    class RegularPolygonPanel extends JPanel { 

     private Polygon polygon; 

     public RegularPolygonPanel() { 
      //Create a Polygon object 
      polygon = new Polygon(); 

      polygon.addPoint(40, 20); 
      polygon.addPoint(70, 40); 
      polygon.addPoint(60, 80); 
      polygon.addPoint(45, 45); 
      polygon.addPoint(20, 60); 
     } 

     public boolean isWithinPolygon(Point p) { 
      return polygon.contains(p); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      //Draw the polygon 
      g.drawPolygon(polygon); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 
    } 
} 
相關問題