java简单画线程序
JFrame里添加了一个JLabell1想实现每次在JFrame里添加组件的时候把组件和l1用线连上··怎么实现啊··...
JFrame里添加了一个JLabel l1
想实现每次在JFrame里添加组件的时候把组件和l1用线连上··怎么实现啊·· 展开
想实现每次在JFrame里添加组件的时候把组件和l1用线连上··怎么实现啊·· 展开
2个回答
展开全部
这个覆盖 paint 方法就可以了。
我帮你写好了,我采用的方法是:把内容画在一个 JPanel 里,然后用 setContentPane 添加到了 JFrame 上,这样做是因为定位问题:JFrame 有边框,绘制组件的时候坐标是算边框占位的,但是 drawLine 的时候是不算的,为了统一算边框,就用了这个办法。
下面是两个文件,第一个 MyFrame 是一个完整的工具,MyFrame 因为继承了 JFrame,用起来和 JFrame 一样用,另外提供了一个接口,addComponent(JComponent) 方法可以向里添加组件,会自动连线的。你只要 import ui 就可以用了。
然后第二个是测试类,可以看到我在 setVisible 之后添加的组件,它也能正确显示,证明 addComponent 方法可以随时调用,不用另外刷新。
---------------------------- MyFrame.java -----------------------------
package ui;
import java.awt.*;
import javax.swing.*;
import java.util.*;
class MyPanel extends JPanel {
private Vector<JComponent> comps;
public MyPanel () {
comps = new Vector<JComponent>();
setLayout(null);
}
public void paint (Graphics g) {
g.setColor(Color.BLACK);
for (int i=1; i<comps.size(); i++) {
g.drawLine(comps.get(0).getLocation().x+comps.get(0).getSize().width/2,
comps.get(0).getLocation().y+comps.get(0).getSize().height/2,
comps.get(i).getLocation().x+comps.get(i).getSize().width/2,
comps.get(i).getLocation().y+comps.get(i).getSize().height/2);
}
super.paintComponents(g);
}
public void addComponent (JComponent comp) {
comp.setOpaque(true);
comps.add(comp);
add(comp);
repaint();
}
}
public class MyFrame extends JFrame {
private MyPanel mp;
public MyFrame () {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mp = new MyPanel();
setContentPane(mp);
}
public void addComponent (JComponent comp) {
mp.addComponent(comp);
}
}
---------------------------- TestMyFrame.java -----------------------------
import ui.*;
import javax.swing.*;
import javax.swing.border.*;
public class TestMyFrame {
public static void main (String args[]) {
MyFrame mf = new MyFrame();
mf.setSize(500, 500);
mf.setLocationRelativeTo(null);
mf.setVisible(true);
testAddComponent(mf);
}
public static void testAddComponent (MyFrame mf) {
JLabel l1 = new JLabel("l1");
l1.setBorder(new EtchedBorder());
l1.setBounds(200, 100, 20, 20);
mf.addComponent(l1);
JLabel l2 = new JLabel("l2");
l2.setBounds(100, 150, 20, 20);
l2.setBorder(new EtchedBorder());
mf.addComponent(l2);
JLabel l3 = new JLabel("l3");
l3.setBounds(150, 150, 20, 20);
l3.setBorder(new EtchedBorder());
mf.addComponent(l3);
JLabel l4 = new JLabel("l4");
l4.setBounds(200, 150, 20, 20);
l4.setBorder(new EtchedBorder());
mf.addComponent(l4);
}
}
我帮你写好了,我采用的方法是:把内容画在一个 JPanel 里,然后用 setContentPane 添加到了 JFrame 上,这样做是因为定位问题:JFrame 有边框,绘制组件的时候坐标是算边框占位的,但是 drawLine 的时候是不算的,为了统一算边框,就用了这个办法。
下面是两个文件,第一个 MyFrame 是一个完整的工具,MyFrame 因为继承了 JFrame,用起来和 JFrame 一样用,另外提供了一个接口,addComponent(JComponent) 方法可以向里添加组件,会自动连线的。你只要 import ui 就可以用了。
然后第二个是测试类,可以看到我在 setVisible 之后添加的组件,它也能正确显示,证明 addComponent 方法可以随时调用,不用另外刷新。
---------------------------- MyFrame.java -----------------------------
package ui;
import java.awt.*;
import javax.swing.*;
import java.util.*;
class MyPanel extends JPanel {
private Vector<JComponent> comps;
public MyPanel () {
comps = new Vector<JComponent>();
setLayout(null);
}
public void paint (Graphics g) {
g.setColor(Color.BLACK);
for (int i=1; i<comps.size(); i++) {
g.drawLine(comps.get(0).getLocation().x+comps.get(0).getSize().width/2,
comps.get(0).getLocation().y+comps.get(0).getSize().height/2,
comps.get(i).getLocation().x+comps.get(i).getSize().width/2,
comps.get(i).getLocation().y+comps.get(i).getSize().height/2);
}
super.paintComponents(g);
}
public void addComponent (JComponent comp) {
comp.setOpaque(true);
comps.add(comp);
add(comp);
repaint();
}
}
public class MyFrame extends JFrame {
private MyPanel mp;
public MyFrame () {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mp = new MyPanel();
setContentPane(mp);
}
public void addComponent (JComponent comp) {
mp.addComponent(comp);
}
}
---------------------------- TestMyFrame.java -----------------------------
import ui.*;
import javax.swing.*;
import javax.swing.border.*;
public class TestMyFrame {
public static void main (String args[]) {
MyFrame mf = new MyFrame();
mf.setSize(500, 500);
mf.setLocationRelativeTo(null);
mf.setVisible(true);
testAddComponent(mf);
}
public static void testAddComponent (MyFrame mf) {
JLabel l1 = new JLabel("l1");
l1.setBorder(new EtchedBorder());
l1.setBounds(200, 100, 20, 20);
mf.addComponent(l1);
JLabel l2 = new JLabel("l2");
l2.setBounds(100, 150, 20, 20);
l2.setBorder(new EtchedBorder());
mf.addComponent(l2);
JLabel l3 = new JLabel("l3");
l3.setBounds(150, 150, 20, 20);
l3.setBorder(new EtchedBorder());
mf.addComponent(l3);
JLabel l4 = new JLabel("l4");
l4.setBounds(200, 150, 20, 20);
l4.setBorder(new EtchedBorder());
mf.addComponent(l4);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询