我正在尝试在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);
}
答案 0 :(得分:2)
getGraphics可以返回null,并且最多只是上一个绘制周期中绘制内容的快照。
虽然您可以使用此技术,但下次需要绘制组件时,您绘制的任何内容都将被删除。
请查看Perofrming Custom Painting和Painting in AWT and Swing,详细了解绘画的工作原理
答案 1 :(得分:1)
要符合摆动图形,请执行以下操作:
public class CrossedLabel extends JLabel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 0, 100, 100);
}
}
答案 2 :(得分:0)
使用无限循环并在内添加“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的结束。