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