问题描述
|
我在框架中有一个角度(我用两条线画出了它)。我想使其框架灵活;我的意思是,当用户扩大框架角度时,框架角度也会扩大,反之亦然。我尝试了很多示例,但无法解决。有人可以帮忙吗?
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,new float[] { 9 },0);
Line2D line2 = new Line2D.Double(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);
}
}
解决方法
这是在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,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.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;
}
}
, 如果坚持使用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,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,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);
}
}