Java paintcomponent方法中的JLabel和GUI代码不会同时绘制

Java paintcomponent方法中的JLabel和GUI代码不会同时绘制,java,swing,jlabel,paintcomponent,Java,Swing,Jlabel,Paintcomponent,当我尝试绘制JLabel或GUI时,我最后添加到JFrame中的任何内容都会被绘制出来,而其余部分则永远不会被绘制或绘制。如果您能帮助我找到一个解决方案,在特定的位置连同GUI一起绘制JLabel,我将不胜感激。我听说过布局,以及它如何帮助我,但有许多不同的人对这个主题有不同的看法。这是我的密码 import java.util.*; import java.awt.*; import javax.swing.*; import javax.swing.Timer; import javax.s

当我尝试绘制JLabel或GUI时,我最后添加到JFrame中的任何内容都会被绘制出来,而其余部分则永远不会被绘制或绘制。如果您能帮助我找到一个解决方案,在特定的位置连同GUI一起绘制JLabel,我将不胜感激。我听说过布局,以及它如何帮助我,但有许多不同的人对这个主题有不同的看法。这是我的密码

import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.JFrame;
import static java.lang.System.*;
import java.awt.event.*;
import java.awt.Graphics.*;


public class Main extends JPanel
{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    double w = screenSize.getWidth();
    double h = screenSize.getHeight();
    static JFrame f = new JFrame("Tic-Tac-Toe");
    static JPanel p = new JPanel();
    int width = (int)w;
    int height = (int)h;
    int width1a = width/2 - 300;
    int width2a = width/2 - 100;
    int width3a = width/2 + 100; 
    int width4a = width/2 + 300;
    int height1from = (int)height - 100;
    int height1to = (int)height - (int)(height/1.05);
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        JLabel l = new JLabel("Hello World !");
        f.add(l);
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(10));
        g.setColor(Color.black);
        g2.drawLine(width1a, height1from, width1a, height1to);
        g2.drawLine(width2a, height1from, width2a, height1to);
        g2.drawLine(width3a, height1from, width3a, height1to);
        g2.drawLine(width4a, height1from, width4a, height1to);
    }
    public static void main(String[] args)
    {
        Main m = new Main();
        f.setSize(400,300);
        f.setExtendedState(Frame.MAXIMIZED_BOTH); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);      
        JLabel l = new JLabel("Hello World !");               
        f.add(p);
        f.add(m);
    }
}

请告诉我我是不是不清楚或者什么。我只希望JLabel和GUI图形出现在JFrame上。请随时提出任何我应该重做的建议,并感谢您抽出时间

您永远不会从绘制方法中向组件添加组件。决不能从绘制方法中以任何方式修改零部件的状态,绘制是为了绘制,而不是其他

看到和 有关如何在Swing中进行绘制的更多详细信息

将三个组件添加到
BorderLayout
中的同一位置时,通常只会显示最后一个组件,因为它是由
BorderLayout

有关更多详细信息,请参阅和

您还应该确保您是在事件调度线程的上下文中创建UI的,有关更多详细信息,请参阅

绘制也与已绘制的组件相关,即
0x0
是组件的左上角,任何超出组件可视范围的绘制都将丢失

您还应该避免使用
静态
,一般来说,这是一个很好的迹象,表明您的设计有问题,它在UI中变得特别混乱。如果你真的想听我抱怨
静态的邪恶
,请查看


您永远不会从绘制方法中向组件添加组件。决不能从绘制方法中以任何方式修改零部件的状态,绘制是为了绘制,而不是其他

看到和 有关如何在Swing中进行绘制的更多详细信息

将三个组件添加到
BorderLayout
中的同一位置时,通常只会显示最后一个组件,因为它是由
BorderLayout

有关更多详细信息,请参阅和

您还应该确保您是在事件调度线程的上下文中创建UI的,有关更多详细信息,请参阅

绘制也与已绘制的组件相关,即
0x0
是组件的左上角,任何超出组件可视范围的绘制都将丢失

您还应该避免使用
静态
,一般来说,这是一个很好的迹象,表明您的设计有问题,它在UI中变得特别混乱。如果你真的想听我抱怨
静态的邪恶
,请查看


仅仅绘制和添加一个JLabel是否需要try-and-catch语句?我对默认的外观和感觉有一种个人的、根深蒂固的憎恨。我更喜欢系统外观,这是我个人的偏好,如果您不想设置外观,您不必这样做。如果TestPane的布局是BorderLayout,您如何为JLabel指定位置?你会用容器吗?这要看情况而定。一个不同的布局管理器可能会给你更好的控制权。仅仅绘制和添加一个JLabel是否需要try-and-catch语句?我对默认的外观和感觉有一种个人的、根深蒂固的憎恨。我更喜欢系统外观,这是我个人的偏好,如果您不想设置外观,您不必这样做。如果TestPane的布局是BorderLayout,您如何为JLabel指定位置?你会用容器吗?这要看情况而定。不同的布局管理器可能会让您更好地控制布局
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel blue = new JPanel();
                blue.setBackground(Color.BLUE);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JLabel("Hello world"), BorderLayout.NORTH);
                frame.add(new TestPane());
                frame.add(blue, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Hello World"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            // This could actually be achieved using a EmptyBorder and a LineBorder
            // but this demonstrates the point...
            g2d.setColor(Color.RED);
            g2d.drawRect(10, 10, getWidth() - 20, getHeight() - 20);
            g2d.dispose();
        }

    }

}