按下按钮时如何绘制垂直线?

时间:2015-01-16 14:26:51

标签: java swing java-2d

当我在Java Swing中按下组件时,我无法绘制线条。我怎样才能做到这一点?我已经使用了paint方法,我的问题是当程序执行paint方法自动调用时,DrawLine()方法将在paint方法中存在,那么有什么方法可以得到除paint方法之外的行?

请提出一些建议。

下面的代码我试过,它显示的是行,但我想在单击组件时显示这些行。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class ReferenceLink1 extends JFrame 
{
    JLabel l1;
    JLabel l2;
    JPanel p1;

    ReferenceLink1()
    {               
        p1 = new JPanel();
        p1.setLayout(null);
        p1.setBackground(Color.ORANGE);
        p1.setOpaque(true);
        p1.setBounds(0,0,300,400);

        setLayout(null);
        l1 = new JLabel();
        l1.setText("l1");
        l1.setBounds(20, 40, 100, 40);
        l1.setHorizontalAlignment(SwingConstants.CENTER);
        l1.setBackground(Color.GREEN);
        l1.setOpaque(true);

        l2 = new JLabel();  ;
        l2.setText("l2");
        l2.setBounds(20, 100,100,40);
        l2.setBackground(Color.BLUE);
        l2.setHorizontalAlignment(SwingConstants.CENTER);
        l2.setOpaque(true);

        p1.add(l1);
        p1.add(l2);
        add(p1);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setBounds(0,0,400,400);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        g.drawLine(77,110,77,130);        
    }

    public static void main(String args[])
    {
        ReferenceLink1 rf = new ReferenceLink1();
    }
}

3 个答案:

答案 0 :(得分:1)

class Surface extends JPanel {

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.blue);

        Dimension size = getSize();
        Insets insets = getInsets();

        int w = size.width - insets.left - insets.right;
        int h = size.height - insets.top - insets.bottom;

        Random r = new Random();

        for (int i = 0; i < 1000; i++) {

            int x = Math.abs(r.nextInt()) % w;
            int y = Math.abs(r.nextInt()) % h;
            g2d.drawLine(x, y, x, y);
        }
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        doDrawing(g);
    }
}

public class Points extends JFrame {

    public Points() {

        initUI();
    }

    private void initUI() {

        setTitle("Points");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new Surface());

        setSize(350, 250);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                Points ps = new Points();
                ps.setVisible(true);
            }
        });
    }
}

答案 1 :(得分:0)

您只需将鼠标侦听器添加到代表按钮的标签上即可。

l2.addMouseListener(new MouseAdapter()
{
    public void mouseClicked(MouseEvent e)
    {
      p1.getGraphics().drawLine(77,110,77,130);
    }
});

答案 2 :(得分:0)

public class ReferenceLink1 extends JFrame  {
    JLabel l1;
    JButton l2;
    JPanel p1;


    public static class MyListener implements ActionListener{

        Graphics g;

        public MyListener(Graphics g) {
            this.g = g;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            g.drawLine(77, 110, 77, 130);

        }

    }

public ReferenceLink1() {

        p1 = new JPanel();
        setVisible(true);
        p1.setLayout(null);
        p1.setBackground(Color.ORANGE);
        p1.setOpaque(true);
        p1.setBounds(0,0,300,400);

        setLayout(null);
        l1 = new JLabel();
        l1.setText("l1");
        l1.setBounds(20, 40, 100, 40);
        l1.setHorizontalAlignment(SwingConstants.CENTER);
        l1.setBackground(Color.GREEN);
        l1.setOpaque(true);


        l2 = new JButton(); 
        l2.addActionListener(new MyListener(this.getGraphics()));
        l2.setText("l2");

        l2.setBounds(20, 100,100,40);
        l2.setBackground(Color.BLUE);
        l2.setHorizontalAlignment(SwingConstants.CENTER);
        l2.setOpaque(true);

        p1.add(l1);
        p1.add(l2);
        add(p1);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setBounds(0,0,400,400);
    }

    public static void main(String args[]) {
        ReferenceLink1 rf = new ReferenceLink1();
    }
}