2

我正在尝试在 java 程序中画一条线,但这条线没有画出来

我已经尝试了所有功能,但在 JLable 上仍然没有行

我不知道为什么我画线后 JLable 的图形没有更新,它仍然是空的。

请帮帮我

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class t
{
private static JFrame frame;
private static JLabel field;

public static void main(String[] args)
{
    frame = new JFrame("Simple Server");
    frame.setLayout(new FlowLayout());

    frame.setPreferredSize(new Dimension(1200, 700));
    frame.setSize(new Dimension(1200, 700));
    frame.setMinimumSize(new Dimension(1200, 700));

    frame.addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowClosing(WindowEvent we)
        {
            System.gc();
            System.exit(0);
        }
    });

    int maxW = 1000, maxH = 600;
    field = new JLabel();
    field.setSize(maxW, maxH);
    field.setPreferredSize(new Dimension(maxW, maxH));
    field.setMaximumSize(new Dimension(maxW, maxH));
    field.setMinimumSize(new Dimension(maxW, maxH));

    field.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
    field.setBackground(Color.GREEN);
    field.setOpaque(true);

    frame.add(field, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);

    Graphics g = field.getGraphics();
    g.drawLine(0, 0, 100, 100);

    field.paintComponents(g);
    field.paint(g);
    field.paintAll(g);
    field.update(g);
    field.repaint();

    frame.paint(g);
    frame.paintAll(g);
    frame.paintComponents(g);
    frame.update(g);
    frame.repaint();
    frame.setVisible(true);
}
4

3 回答 3

2

getGraphics 可以返回 null 并且充其量是上一次绘制周期绘制的内容的快照。

虽然您可以使用此技术,但下次需要绘制组件时,您绘制的任何内容都将被删除。

查看Perofrming Custom PaintingPainting in AWT and Swing了解有关绘画工作原理的更多详细信息

于 2013-07-21T07:12:00.147 回答
1

要与摆动图形一致,请执行以下操作:

public class CrossedLabel extends JLabel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(0, 0, 100, 100);
    }
}
于 2013-07-21T07:02:39.430 回答
0

使用无限while循环并在其中添加行“g.drawLine(0,0,100,100);” 单独然后结束主要功能。然后在屏幕上可以看到一条线。同样,您可以使用循环来播放动画,直到某个条件完成以使其工作。

代码应如下所示:-

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class t implements Runnable
{
private static JFrame frame;
private static JLabel field;
private java.lang.Thread tdr;
t()
{
 tdr = new java.lang.Thread(this);
}

public static void main(String[] args)
{
    t tsk= new t();
    frame = new JFrame("Simple Server");
    frame.setLayout(new FlowLayout());

    frame.setPreferredSize(new Dimension(1200, 700));
    frame.setSize(new Dimension(1200, 700));
    frame.setMinimumSize(new Dimension(1200, 700));

    frame.addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowClosing(WindowEvent we)
        {
            System.gc();
            System.exit(0);
        }
    });

    int maxW = 1000, maxH = 600;
    field = new JLabel();
    field.setSize(maxW, maxH);
    field.setPreferredSize(new Dimension(maxW, maxH));
    field.setMaximumSize(new Dimension(maxW, maxH));
    field.setMinimumSize(new Dimension(maxW, maxH));

    field.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
    field.setBackground(Color.GREEN);
    field.setOpaque(true);

    frame.add(field, BorderLayout.CENTER);

    frame.pack();
    frame.setVisible(true);
    Graphics g = field.getGraphics();
 while(true)
 {
    g.drawLine(0, 0, 100, 100);
 try{

    tsk.tdr.sleep(1000);
 }
 catch ( Exception e)
 {
     System.out.println(e.getMessage());
 }
  System.out.println("Thread started");
}
}

    @Override
    public void run() {
       tdr.start();
    }
}

类似地,在 while 循环中使用一些其他条件而不是 true,这将满足直到将圆从点 a 移动到 b 的动画完成。

于 2013-07-21T08:35:08.593 回答