在java中画一条没有继承的线
我试图在java程序中画一条线,但这条线还没有画出来 我已经尝试了所有功能,但在JLable上仍然没有线路 我不知道为什么我画完线后JLable的图形没有更新,它仍然是空的 请帮帮我在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
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)
请在建议此方法之前运行此操作。这可能会阻止事件调度,导致程序挂起。这不是在秋千上绘画的方式