(我已经看过其他两个与我的标题类似的问题,但它们不同,并没有为我的问题提供解决方案。)
您好,
我有以下简单显示行的代码。我在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语句之前的任何设置(即在主要设置中,例如大小)。
我很确定这是非常愚蠢的问题,因为它昨天有效,不知道我改变了什么,但我只是放弃了。
答案 0 :(得分:1)
我刚改变了这两行的顺序。
frame.setVisible(true);
DrawGraph1 obj = new DrawGraph1(frame);
到
DrawGraph1 obj = new DrawGraph1(frame);
frame.setVisible(true);
和输出:
答案 1 :(得分:1)
首先,您将JFrame传递给JPanel。您应该创建JPanel,并将其传递给JFrame。
以下是我所做的主要更改。
所有Swing GUI创建都必须在Event Dispatch Thread上。这包括JFrame和JPanel。我在main方法中添加了一个Runnable,并调用EventQueue invokeLater方法在Event Dispatch Thread上启动Swing GUI。
我在main方法中移动了所有JFrame代码,并在DrawGraph1类paintComponent方法中移动了所有JPanel绘图代码。 paintComponent方法仅用于绘制。在其他课程和/或其他方法中进行其他处理。
必须按特定顺序调用JFrame方法。按照我在代码中调用它们的顺序调用JFrame方法。
我在paintComponent方法中添加了对super.paintComponent的调用。这样可以保持Swing油漆链并清除绘图面板。
我将GUI的大小从JFrame移到了JPanel。您关注的是绘图面板的大小,而不是整个GUI。
这是修改后的代码。我重命名了这个类,以免它与我的测试包中的其他代码发生冲突。你应该改回来。
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);
}
}