2011-06-14 71 views
0

我在一个框架中有一个角度(我画两条线)。我想让它灵活的框架;我的意思是,当用户扩展时,框架角度也会扩大,反之亦然。我尝试了很多例子,但我无法解决它。有人可以帮忙吗?可调整大小的角度

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

public class LineDraw extends Frame { 
    Line2D line1 = new Line2D.Double(200, 200, 100, 300); 
    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, 
      new float[] { 9 }, 0); 
    Line2D line2 = new Line2D.Double(200, 200, 200, 300); 

    public void paint(Graphics g) { 
     Graphics2D graph = (Graphics2D) g; 
     graph.setPaint(Color.red); 
     graph.draw(line2); 
     graph.setStroke(drawingStroke1); 
     graph.setPaint(Color.green); 
     graph.draw(line1); 

    } 

    public static void main(String args[]) { 
     Frame frame = new LineDraw(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent we) { 
       System.exit(0); 
      } 
     }); 
     frame.setSize(300, 250); 
     frame.setVisible(true); 
    } 
} 
+1

请张贴您的相关代码。 – 2011-06-14 16:30:38

+0

我改变了标签,因为这与Eclipse无关。 – 2011-06-14 18:09:00

+1

它看起来像你的线条不应该是常量,而是从Frame的大小构建在paint()里面。 – 2011-06-14 18:12:43

回答

1

这里是在Swing中完成的。所有东西都在EDT中完成,就像Swing所预期的那样,因为它不是线程安全的。它是双缓冲的。为什么JLabel/Icon组合?据我所知,这只是最好的方式,而且我很难给你一个关于为什么的历史/技术解释 - 这就是它的设计方式。另一种方法是参与BufferStrategy,但开始变得更加复杂的恕我直言。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 

public class LineDrawSwing extends JLabel implements Icon { 
    Line2D line1, line2; 

    public LineDrawSwing() { this.setIcon(this); } 

    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, 
      new float[] { 9 }, 0); 

    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent we) { 
       System.exit(0); 
      } 
     }); 
     frame.add(new LineDrawSwing()); 
     frame.validate(); 
     frame.setSize(300, 250); 
     frame.setVisible(true); 
    } 

    @Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     Dimension size = getSize(); 
     line1 = new Line2D.Double(size.width/2, size.height-10, 10, 10); 
     line2 = new Line2D.Double(size.width/2, size.height-10, size.width-10, 10); 
     Graphics2D graph = (Graphics2D) g; 
     graph.setPaint(Color.red); 
     graph.draw(line2); 
     graph.setStroke(drawingStroke1); 
     graph.setPaint(Color.green); 
     graph.draw(line1); 
    } 

    @Override 
    public int getIconHeight() { 
     return getSize().height; 
    } 

    @Override 
    public int getIconWidth() { 
     return getSize().width; 
    } 
} 
1

如果坚持使用AWT,我会使用ComponentListener跟踪Frame的大小更改并相应地重置行坐标。

您可能会忽略创建/更新Frame.paint()上下文中的行,但这不是一个非常干净的实现,有很多隐含的逻辑和假设,因此可能存在一些问题。

所以这里是ComponentListener方法。我不得不做出一些关于你想让你的线条从哪里得到的假设,因为你不清楚这一点。 (如果你可以更清楚一点,我可以更新这个例子。)

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

public class LineDraw extends Canvas implements ComponentListener { 
    Line2D line1, line2; 

    public LineDraw() { 
     this.addComponentListener(this); 
    } 

    // set up lines every size update 
    public void componentResized(ComponentEvent e) { 
     Dimension size = getSize(); 
     line1 = new Line2D.Double(size.width/2, size.height-10, 10, 10); 
     line2 = new Line2D.Double(size.width/2, size.height-10, size.width-10, 10); 
    } 

    // required to satisfy ComponentListener interface 
    public void componentHidden(ComponentEvent e) { } 
    public void componentMoved(ComponentEvent e) { } 
    public void componentShown(ComponentEvent e) { } 

    // paint, main both as before 

    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, 
      new float[] { 9 }, 0); 

    public void paint(Graphics g) { 
     Graphics2D graph = (Graphics2D) g; 
     graph.setPaint(Color.red); 
     graph.draw(line2); 
     graph.setStroke(drawingStroke1); 
     graph.setPaint(Color.green); 
     graph.draw(line1); 
    } 

    public static void main(String args[]) { 
     Frame frame = new Frame(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent we) { 
       System.exit(0); 
      } 
     }); 
     frame.add(new LineDraw()); 
     frame.validate(); 
     frame.setSize(300, 250); 
     frame.setVisible(true); 
    } 
} 
+1

更新了它,以反映@PaŭloEbermann关于不直接绘制到框架的好处。上面的代码已经过测试/可用。然而,它不是双重缓冲,但这完全是另一回事,取决于你想如何接近它。我将发布另一个使用Swing的答案。 – 2011-07-12 14:21:56

+0

谢谢Charles我用你的代码解决了我的问题。 – SunyGirl 2011-07-22 19:32:27

+0

@SunyGirl:点击'勾号'然后接受答案。 ;-) – 2011-07-22 19:35:43