Java 使用线程在Jpanel对象上添加图形
我想在这个程序中添加图形。图形将绘制在“drawPanel”对象上。我必须在这里用线 不知道如何使用线程在Jpanel对象中绘制。在Jpanel对象上绘制图形的有效方法是什么 线程和Java 使用线程在Jpanel对象上添加图形,java,swing,jpanel,java-threads,Java,Swing,Jpanel,Java Threads,我想在这个程序中添加图形。图形将绘制在“drawPanel”对象上。我必须在这里用线 不知道如何使用线程在Jpanel对象中绘制。在Jpanel对象上绘制图形的有效方法是什么 线程和paintComponent()将如何交互。谢谢 代码: 我必须在“drawPanel”Jpanel对象上添加图形 然后需要扩展JPanel并重写paintComponent(…)方法来进行自定义绘制 阅读上Swing教程中的部分,了解更多信息和工作示例,以便开始。只需在add()方法中从另一个类添加此类对象 这将起
paintComponent()
将如何交互。谢谢
代码:
我必须在“drawPanel”Jpanel对象上添加图形
然后需要扩展JPanel
并重写paintComponent(…)
方法来进行自定义绘制
阅读上Swing教程中的部分,了解更多信息和工作示例,以便开始。只需在add()方法中从另一个类添加此类对象 这将起作用(经过测试):
公共类LinearSearchSimulation扩展了JPanel实现可运行{
私人最终整数延迟=50;
私人JPanel主面板;
int x=0,y=0;
私有线程;
私有布尔threadFlag=false;
public LinearSearchSimulation(JPanel主面板){
this.mainPanel=mainPanel;
挫折地面(颜色:白色);
}
公开作废开始(){
if(threadFlag){
回来
}
threadFlag=true;
线程=新线程(此);
thread.start();
}
公共停车场(){
如果(!threadFlag){
回来
}
threadFlag=false;
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
@凌驾
公共组件(图形g){
超级组件(g);
g、 椭圆形(x,y,55,55);
g、 处置();
}
公共无效更新(){
x+=1;
y+=1;
}
@凌驾
公开募捐{
很久以前的时间,时差,睡眠;
beforeTime=System.currentTimeMillis();
while(threadFlag){
更新();
重新油漆();
timeDiff=System.currentTimeMillis()-beforeTime;
睡眠=延迟-时间差;
如果(睡眠<0)
睡眠=2;
试一试{
睡眠;
}捕捉(中断异常e){
系统输出打印项次(“中断”);
}
beforeTime=System.currentTimeMillis();
}
}
}
应用程序在哪一点以及如何运行。做“线性搜索”?我认为最合适的动画方法是画一个进度条的功能等价物。例如,一个带边框的矩形,延伸到大部分可视区域,填充背景色。然后在该边界内填充一个较小(宽度较小)的矩形,表示到该时刻的进度。在150条记录中搜索了50条,这将填补第三条记录。百分之五十,一半。至于使用线程来完成搜索,这在很大程度上取决于你是如何使用线程来搜索的。为了更快地获得更好的帮助,请发布一个or。保持你的问题没有噪音,所以不要添加“添加答案”之类的内容。
public class LinearSearch extends JPanel{
private final Font LABEL_FONT = new Font("courier", Font.BOLD, 30);
private JPanel mainPanel;
private JPanel centerPanel;
private JPanel inputPanel;
private JPanel drawPanel;
private JLabel lblTitle;
private Button btnBack;
public LinearSearch(JPanel mainPanel) {
this.mainPanel = mainPanel;
setBackground(Color.WHITE);
initialize_All();
}
private void initialize_All() {
lblTitle = new JLabel("\"Linear Search\"", SwingConstants.CENTER);
lblTitle.setFont(LABEL_FONT);
///Center Panel
centerPanel = new JPanel();
centerPanel.setLayout(new BorderLayout());
///Input Panel
inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS));
///Draw Panel
drawPanel = new JPanel();
drawPanel.setLayout(new FlowLayout());
/// I want to add graphics on this drawPanel Jpanel
btnBack = new Button("Back");
btnBack.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
setVisible(false);
removeAll();
mainPanel.add(new CatagoriesMenu(mainPanel));
}
});
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
setLayout(new BorderLayout(10, 10));
add(lblTitle, BorderLayout.PAGE_START);
add(centerPanel, BorderLayout.CENTER);
add(btnBack, BorderLayout.PAGE_END);
centerPanel.add(inputPanel, BorderLayout.PAGE_START);
centerPanel.add(drawPanel, BorderLayout.CENTER);
}
}
public class LinearSearchSimulation extends JPanel implements Runnable{
private final int DELAY = 50;
private JPanel mainPanel;
int x=0, y=0;
private Thread thread;
private boolean threadFlag = false;
public LinearSearchSimulation(JPanel mainPanel){
this.mainPanel = mainPanel;
setBackground(Color.WHITE);
}
public void start() {
if (threadFlag) {
return;
}
threadFlag = true;
thread = new Thread(this);
thread.start();
}
public void stop() {
if (!threadFlag) {
return;
}
threadFlag = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(x,y, 55, 55);
g.dispose();
}
public void update() {
x += 1;
y += 1;
}
@Override
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (threadFlag) {
update();
repaint();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = DELAY - timeDiff;
if (sleep < 0)
sleep = 2;
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
beforeTime = System.currentTimeMillis();
}
}
}