在java中画一条没有继承的线

在java中画一条没有继承的线,java,swing,drawing,line,jlabel,Java,Swing,Drawing,Line,Jlabel,我试图在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

我试图在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);
}

要符合swing图形,请执行以下操作:

public class CrossedLabel extends JLabel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(0, 0, 100, 100);
    }
}

getGraphics可以返回null,充其量是上一个绘制周期中绘制的内容的快照

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


查看并获取有关绘画工作原理的更多详细信息

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

代码如下所示:-

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移动圆的动画为止,这些条件都会满足。

出于好奇,为什么要对自己施加任意的“无继承”限制?因为通过扩展JLabel和覆盖
paintComponent(Graphics g)
method,使用Swing绘制很容易,实际上这是我项目的一部分。我在互联网上搜索,发现每个程序都覆盖了paintComponent,但我应该尝试用
SwingUtilities.invokeLater()
来包装您的swing代码。Swing不是线程安全的,在事件分派线程之外修改组件可能会导致难以调试的问题。至于这个问题,每个人都会覆盖
paintComponent()
,因为这是正确的方法。那么,这样我如何移动屏幕上的一个圆呢?因为这个程序将是这样一个动画:)另外,看看和。虽然我同意,成功往往是在与正常相反的方向上发现的,但事情是以某种方式完成的,这是有原因的,但我如何才能使它充满活力??我的意思是,我如何定义一个函数,每次我调用它时,它都会画一条线,例如??如果你想保持在合理的范围内,这是不可能的。如果你想每次画不同的线,可以通过调用方法来改变一些标志,而不是使用新的swing图形操作。除非你有充分的理由,否则你永远不应该合理地调用`getGraphics on swing component/,那么我如何编程动画呢?例如,一个移动的圆圈是完全不同的,最好留给一个单独的问题。如果你给我这个链接,我会回答的。这个代码段中有很多东西是错误的/老式的。不鼓励手动设置尺寸,因为布局问题可以计算尺寸。此代码基本上类似于AWT设计。不要将WindowListener添加到JFrame中,如果可以通过使用
frameReference来实现这一点。setDefaultCloseOperation(JFrame.EXIT\u ON\u CLOSE)
请在建议此方法之前运行此操作。这可能会阻止事件调度,导致程序挂起。这不是在秋千上绘画的方式