Java 当我交换注释行时,我收到不同的输出。

Java 当我交换注释行时,我收到不同的输出。,java,swing,jframe,jpanel,awt,Java,Swing,Jframe,Jpanel,Awt,我正在学习java抽象窗口工具包,我被困在这段代码中。当我交换注释行时,输出会发生变化。对这两种情况的任何解释都将不胜感激 import java.awt.*; public class guibutton { public guibutton() { Frame f = new Frame("Panel Example"); Panel panel = new Panel(); panel.setBounds(40,80,200,200); panel.setBackground(Col

我正在学习java抽象窗口工具包,我被困在这段代码中。当我交换注释行时,输出会发生变化。对这两种情况的任何解释都将不胜感激

import java.awt.*;
public class guibutton
{
public guibutton()
{
Frame f = new Frame("Panel Example");   
Panel panel = new Panel();
panel.setBounds(40,80,200,200);
panel.setBackground(Color.gray);
f.add(panel);


f.setVisible(true); ////////////////this line

f.setLayout(null); /////////////////this line

f.setResizable(true);
f.setSize(400,400);

}
public static void main(String args[])
{
    new guibutton();
}
}
这一行:

f.setVisible(true);
在当前状态下呈现GUI,其中JFrame的默认BorderLayout有效。请注意,BorderLayout忽略
setBounds(…)
方法

这一行:

f.setLayout(null); 
删除JFrame contentPane的BorderLayout,因此您的GUI在没有布局的情况下呈现,从而更改添加的JPanel的位置--这里的
setBounds(…)
方法调用受到尊重

如果在呈现GUI后调用此函数,则不会产生任何效果,除非您执行一些触发布局管理器重新布局组件的操作,例如重新调整GUI的大小

我自己不会使用AWT,而是使用Swing,我会在JPanel的paintComponent方法中使用矩形对象绘制矩形。这样,我就可以监视鼠标与矩形的关系,并更改其状态。例如,试用此程序,看看鼠标悬停在矩形上时矩形会发生什么变化:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class GuiButton2 extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int RECT_X = 40;
    private static final int RECT_Y = 80;
    private static final int RECT_W = 200;
    private static final Color DEFAULT_RECT_COLOR = Color.GRAY;
    private static final Color HOVER_RECT_COLOR = Color.PINK;
    private Rectangle rectangle = new Rectangle(RECT_X, RECT_Y, RECT_W, RECT_W);
    private boolean hover = false;

    public GuiButton2() {
        setPreferredSize(new Dimension(PREF_W, PREF_H));
        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                // hover true if mouse is hovering over the rectangle
                hover = rectangle.contains(e.getPoint());
                repaint();
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        // if hover true -- use hover color, otherwise use default color
        Color c = hover ? HOVER_RECT_COLOR : DEFAULT_RECT_COLOR;
        g2.setColor(c);
        g2.fill(rectangle);  // draw rectangle
    }

    private static void createAndShowGui() {
        GuiButton2 mainPanel = new GuiButton2();

        JFrame frame = new JFrame("GUI Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
旁注1:
虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

旁注2:
你会想要学习和使用。变量名都应该以小写字母开头,而类名应该以大写字母开头。学习这一点并遵循这一点将使我们能够更好地理解您的代码,也将使您能够更好地理解其他人的代码。

这一行:

f.setVisible(true);
在当前状态下呈现GUI,其中JFrame的默认BorderLayout有效。请注意,BorderLayout忽略
setBounds(…)
方法

这一行:

f.setLayout(null); 
删除JFrame contentPane的BorderLayout,因此您的GUI在没有布局的情况下呈现,从而更改添加的JPanel的位置--这里的
setBounds(…)
方法调用受到尊重

如果在呈现GUI后调用此函数,则不会产生任何效果,除非您执行一些触发布局管理器重新布局组件的操作,例如重新调整GUI的大小

我自己不会使用AWT,而是使用Swing,我会在JPanel的paintComponent方法中使用矩形对象绘制矩形。这样,我就可以监视鼠标与矩形的关系,并更改其状态。例如,试用此程序,看看鼠标悬停在矩形上时矩形会发生什么变化:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class GuiButton2 extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int RECT_X = 40;
    private static final int RECT_Y = 80;
    private static final int RECT_W = 200;
    private static final Color DEFAULT_RECT_COLOR = Color.GRAY;
    private static final Color HOVER_RECT_COLOR = Color.PINK;
    private Rectangle rectangle = new Rectangle(RECT_X, RECT_Y, RECT_W, RECT_W);
    private boolean hover = false;

    public GuiButton2() {
        setPreferredSize(new Dimension(PREF_W, PREF_H));
        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                // hover true if mouse is hovering over the rectangle
                hover = rectangle.contains(e.getPoint());
                repaint();
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        // if hover true -- use hover color, otherwise use default color
        Color c = hover ? HOVER_RECT_COLOR : DEFAULT_RECT_COLOR;
        g2.setColor(c);
        g2.fill(rectangle);  // draw rectangle
    }

    private static void createAndShowGui() {
        GuiButton2 mainPanel = new GuiButton2();

        JFrame frame = new JFrame("GUI Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
旁注1:
虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

旁注2:

你会想要学习和使用。变量名都应该以小写字母开头,而类名应该以大写字母开头。学习并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。

请参阅对答案的编辑请参阅对答案的编辑