2012-02-23 2 views
2

Я использую графический интерфейс создания графического интерфейса Netbeans, и я заинтересован в создании квадрата 300 на 300 с небольшой точкой, обозначающей позицию на этом квадрате. JPanel казался хорошим местом для начала, и он дает мне координаты, которые мне нужны, чтобы указать положение, где рисовать точку; но я не знаю, как создать такую ​​подвижную точку внутри рамки, в которой я работаю.Пользовательское положение графики с JFrame/JPanel/Netbeans

Я понимаю, что одним из решений было бы отключить диспетчер компоновки, но это не похоже на очень хорошее решение. Я признателен за любые рекомендации или ссылки на полезные ресурсы :-)

+1

couldbe хороший вопрос +1, лучше бы опубликовать [SSCCE] (http://sscce.org/) – mKorbel

ответ

3

Может быть, это

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.*; 
import java.util.ArrayList; 

public class PathIteratorTest { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("FlatteningPathIterator test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Shape s=new Ellipse2D.Float(10,10,200,100); 
     PaintPanel app = new PaintPanel(s); 
     JScrollPane scroll = new JScrollPane(app); 
     frame.getContentPane().add(scroll); 

     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static class PaintPanel extends JPanel { 
     FlatteningPathIterator iter; 
     ArrayList<Point> points; 
     int index=0; 
     public PaintPanel(Shape s) { 
      iter=new FlatteningPathIterator(s.getPathIterator(new AffineTransform()), 1); 
      points=new ArrayList<Point>(); 
      float[] coords=new float[6]; 
      while (!iter.isDone()) { 
       iter.currentSegment(coords); 
       int x=(int)coords[0]; 
       int y=(int)coords[1]; 
       points.add(new Point(x,y)); 
       iter.next(); 
      } 
      Timer timer=new Timer(50, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        index++; 
        if (index>=points.size()) { 
         index=0; 
        } 
        repaint(); 
       } 
      }); 
      timer.start(); 
     } 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.setColor(Color.blue); 
      Point p=points.get(index); 
      g.fillOval(p.x, p.y, 5,5); 
     } 
    } 
} 
+0

Спасибо вам большое! В сочетании с информацией, которую я нашел о том, как включить пользовательский подкласс компонента Swing (http://wiki.netbeans.org/FaqFormUsingCustomComponent) и еще один отличный пример (http://www.alnaja7.org/Programmer/393/GUI /Extend%20JPanel%20to%20create%20new%20components.htm) Я смог сделать именно такую ​​панель, которую я хотел :-) – tor

Смежные вопросы