调用线程时为什么JFrame无法显示?

时间:2016-03-19 16:32:41

标签: java multithreading jframe

(我已经看过其他两个与我的标题类似的问题,但它们不同,并没有为我的问题提供解决方案。)

您好,

我有以下简单显示行的代码。我在main中声明了一个JFrame,然后调用了DrawGraph1类的一个新实例,并将JFrame作为参数传递。 在构造函数中,我调用了一个线程(EventQueue.invokeLater)。构造函数使用JFrame并使用它来创建一些行和字符串等等。

(抱歉不正确的缩进,已经调整了很多)

package test;
import java.awt.*;
import java.awt.geom.*;
import java.text.DateFormatSymbols;
import javax.swing.*;

public class test {
   public static void main(String[] args){                 
       final JFrame frame = new JFrame();   

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(800, 700);
       frame.setVisible(true);  
       DrawGraph1 obj = new DrawGraph1(frame);
}
}
class DrawGraph1{        
    DrawGraph1(final JFrame frame){
        EventQueue.invokeLater(new Runnable(){            
        @Override               
        public void run(){                 
       frame.setTitle("LineDrawing");     
        frame.add(new JComponent()
            {
               @Override
               public void paintComponent(Graphics g)
               {
                  Graphics2D g2 = (Graphics2D) g;
                  Line2D line = new Line2D.Double();
                  int decrement = 0, label = 0;                  

                  g2.setColor(Color.red);          
                  g.drawString("Red Line ->> High temperatures", 330, 110);
                  g2.setColor(Color.green);          
                  g.drawString("Green Line ->> Low temperatures", 330, 130);
                  } });}});}}

所以根据我的测试,程序到达构造函数,传递框架,并启动线程,但显然它在行停止

frame.add(new JComponent()

使用NetBeans调试器强调(或某些)add方法。我也尝试过在main中调用线程,将JFrame传递给构造函数,跳转到它,它也会停止在同一个语句中。

显示只是Frame本身,具有add语句之前的任何设置(即在主要设置中,例如大小)。

我很确定这是非常愚蠢的问题,因为它昨天有效,不知道我改变了什么,但我只是放弃了。

2 个答案:

答案 0 :(得分:1)

我刚改变了这两行的顺序。

frame.setVisible(true);
DrawGraph1 obj = new DrawGraph1(frame);

DrawGraph1 obj = new DrawGraph1(frame);
frame.setVisible(true);

和输出:

Output

答案 1 :(得分:1)

首先,您将JFrame传递给JPanel。您应该创建JPanel,并将其传递给JFrame。

以下是我所做的主要更改。

  1. 所有Swing GUI创建都必须在Event Dispatch Thread上。这包括JFrame和JPanel。我在main方法中添加了一个Runnable,并调用EventQueue invokeLater方法在Event Dispatch Thread上启动Swing GUI。

  2. 我在main方法中移动了所有JFrame代码,并在DrawGraph1类paintComponent方法中移动了所有JPanel绘图代码。 paintComponent方法仅用于绘制。在其他课程和/或其他方法中进行其他处理。

  3. 必须按特定顺序调用JFrame方法。按照我在代码中调用它们的顺序调用JFrame方法。

  4. 我在paintComponent方法中添加了对super.paintComponent的调用。这样可以保持Swing油漆链并清除绘图面板。

  5. 我将GUI的大小从JFrame移到了JPanel。您关注的是绘图面板的大小,而不是整个GUI。

  6. 这是修改后的代码。我重命名了这个类,以免它与我的测试包中的其他代码发生冲突。你应该改回来。

    package com.ggl.testing;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Line2D;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class SimpleJPanelTest {
    
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    final JFrame frame = new JFrame("Line Drawing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    frame.add(new DrawGraph1());
                    frame.pack();
                    frame.setLocationByPlatform(true);
                    frame.setVisible(true);
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    
    class DrawGraph1 extends JPanel {
    
        private static final long serialVersionUID = 6733473371292195071L;
    
        public DrawGraph1() {
            setPreferredSize(new Dimension(800, 700));
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Graphics2D g2 = (Graphics2D) g;
            Line2D line = new Line2D.Double();
            int decrement = 0, label = 0;
    
            g2.setColor(Color.red);
            g.drawString("Red Line ->> High temperatures", 330, 110);
            g2.setColor(Color.green);
            g.drawString("Green Line ->> Low temperatures", 330, 130);
        }
    
    }