Java表单元素在激活(即单击)之前不会完全显示

Java表单元素在激活(即单击)之前不会完全显示,java,forms,user-interface,graphics,elements,Java,Forms,User Interface,Graphics,Elements,我一直在尝试向全屏独占模式框架添加Java表单元素,如textField和passwordField。我一直遇到的问题是,当我运行代码时,我的表单元素不会完全显示或根本不会显示,直到我实际单击它们 这是我的密码: Master.java import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; imp

我一直在尝试向全屏独占模式框架添加Java表单元素,如textField和passwordField。我一直遇到的问题是,当我运行代码时,我的表单元素不会完全显示或根本不会显示,直到我实际单击它们

这是我的密码:

Master.java

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Master extends JFrame {

    private static final long serialVersionUID = -4927941474660261348L;
    static GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    static GraphicsDevice gd = ge.getDefaultScreenDevice();
    static int WIDTH = gd.getDisplayMode().getWidth();
    static int HEIGHT = gd.getDisplayMode().getHeight();
    static Toolkit toolkit = Toolkit.getDefaultToolkit();
    static Graphics2D g2d = null;
    static FontMetrics metrics = null;
    static URL vignetteURL = null;
    static Image vignette = null;
    static Rectangle red = new Rectangle(WIDTH - 35, 0, 35, 35);

    public Master() {
        super("Project Zenith");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        getContentPane().setLayout(null);
        setUndecorated(true);
        setResizable(false);
        gd.setFullScreenWindow(this);
        repaint();

        setIconImage(new ImageIcon(getClass().getResource("images/hex.png")).getImage());
        vignetteURL = getClass().getResource("images/vignette2.png");

        addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getX() >= red.getX() && e.getY() <= red.getHeight()) {
                    closeClicked();
                }
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {

            }

            @Override
            public void mouseExited(MouseEvent arg0) {

            }

            @Override
            public void mousePressed(MouseEvent arg0) {

            }

            @Override
            public void mouseReleased(MouseEvent arg0) {

            }           
        });
    }

    public void update(Graphics g) {
        paint(g);
    }

    public void paint(Graphics g) {
        g2d = (Graphics2D) g;
        vignette = toolkit.getImage(vignetteURL);
        g2d.clearRect(0, 0, getWidth(), getHeight());
        g2d.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
        metrics = g2d.getFontMetrics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setColor(new Color(168, 168, 168, 200));
        g2d.drawString("Project Zenith", 10, HEIGHT - 10);
        g2d.setColor(new Color(0xFFA6A6));
        g2d.fill(red);
        g2d.drawImage(vignette, 0, 0, WIDTH, HEIGHT, this); 

    }

    public void closeClicked() {
        System.exit(0);
    }
}
首先看一看并解释一下Swing中绘画是如何工作的

基本问题是:

  • 你把油漆链弄断了
  • 您正在子组件上绘制
  • 这是不应该覆盖顶级容器的
    paint
    的原因之一。相反,首先使用
    JPanel
    并覆盖它的
    paintComponent
    (在执行任何自定义绘制之前调用
    super.paintComponent

    您还应该使用适当的布局管理器来更好地处理分辨率和字体呈现要求的差异

    请查看以了解更多详细信息

    通过一点聪明的计划,你可以做一些相当先进的事情

    现在,显然这不是全屏显示,但这就是重点,您现在可以取消注释行
    gd.setFullScreenWindow(frame)和它将自动神奇地重新调整自己,通过布局管理器的力量

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.geom.RoundRectangle2D;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.EmptyBorder;
    
    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();
                    }
                    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                    GraphicsDevice gd = ge.getDefaultScreenDevice();
    
                    Login login = new Login();
                    JFrame frame = new JFrame("Project Zenith");
                    frame.setUndecorated(true);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(login);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
    //              gd.setFullScreenWindow(frame);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class Master extends JPanel {
    
            private static final long serialVersionUID = -4927941474660261348L;
    
            private Rectangle closeRect;
    
            public Master() {
    
                addMouseListener(new MouseListener() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getX() >= closeRect.getX() && e.getY() <= closeRect.getHeight()) {
                            closeClicked();
                        }
                    }
    
                    @Override
                    public void mouseEntered(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mouseExited(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mousePressed(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mouseReleased(MouseEvent arg0) {
    
                    }
                });
            }
    
            @Override
            public void invalidate() {
                super.invalidate();
                closeRect = new Rectangle(getWidth() - 35, 0, 35, 35);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
                g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2d.setColor(new Color(168, 168, 168, 200));
                FontMetrics fm = g2d.getFontMetrics();
                int y = (getHeight() - fm.getHeight()) + fm.getAscent();
                g2d.drawString("Project Zenith", 10, y);
                g2d.setColor(new Color(0xFFA6A6));
                g2d.fill(closeRect);
            }
    
            public void closeClicked() {
                System.exit(0);
            }
        }
    
        public static class Login extends Master {
    
            private static final long serialVersionUID = 1L;
            private JTextField username;
            private JTextField password;
    
    
            Login() {
                Font inputFont = new Font("Calibri", Font.PLAIN, 15);
    
                setLayout(new GridBagLayout());
    
                JPanel content = new JPanel(new GridBagLayout()) {
                    @Override
                    protected void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        RoundRectangle2D loginRect = new RoundRectangle2D.Float(0, 0, getWidth() - 1, getHeight() - 1, 20, 20);
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.setColor(Color.WHITE);
                        g2d.fill(loginRect);
                        g2d.setColor(new Color(0xA8A8A8));
                        g2d.draw(loginRect);
                    }
                };
                content.setBorder(new EmptyBorder(20, 20, 20, 20));
    
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.insets = new Insets(0, 0, 25, 0);
    
                gbc.gridx = 0;
                gbc.gridy = 0;
    
                JLabel label = new JLabel("Access Terminal");
                label.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
                label.setForeground(new Color(0xA8A8A8));
    
                content.add(label, gbc);
    
                gbc.gridy++;
                username = new JTextField(25);
                username.setFont(inputFont);
                username.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                username.setEditable(true);
                username.setBackground(new Color(0xE6E6E6));
                //username.setVisible(true);
                content.add(username, gbc);
    
                gbc.gridy++;
                password = new JPasswordField(25);
                password.setFont(inputFont);
                password.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                password.setEditable(true);
                password.setBackground(new Color(0xE6E6E6));
                //password.setVisible(true);
                content.add(password, gbc);
    
                gbc.gridy++;
    
                JButton loginButton = new JButton("Login");
                loginButton.setFont(inputFont);
                loginButton.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                loginButton.setBackground(new Color(0xE6E6E6));
                loginButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        System.out.println(username.getText());
                    }
                });
                content.add(loginButton, gbc);
    
                add(content);
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        }
    }
    
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.awt.EventQueue;
    导入java.awt.Font;
    导入java.awt.FontMetrics;
    导入java.awt.Graphics;
    导入java.awt.Graphics2D;
    导入java.awt.GraphicsDevice;
    导入java.awt.GraphicsEnvironment;
    导入java.awt.GridBagConstraints;
    导入java.awt.GridBagLayout;
    导入java.awt.Insets;
    导入java.awt.Rectangle;
    导入java.awt.RenderingHints;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入java.awt.event.MouseEvent;
    导入java.awt.event.MouseListener;
    导入java.awt.geom.RoundRectangle2D;
    导入javax.swing.BorderFactory;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.JPasswordField;
    导入javax.swing.JTextField;
    导入javax.swing.UIManager;
    导入javax.swing.UnsupportedLookAndFeelException;
    导入javax.swing.border.EmptyBorder;
    公开课考试{
    公共静态void main(字符串[]args){
    新测试();
    }
    公开考试(){
    invokeLater(新的Runnable(){
    @凌驾
    公开募捐{
    试一试{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
    例如printStackTrace();
    }
    GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd=ge.getDefaultScreenDevice();
    Login Login=新登录();
    JFrame=新JFrame(“项目顶点”);
    框架。设置未装饰(真实);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(登录);
    frame.pack();
    frame.setLocationRelativeTo(空);
    //gd.setFullScreenWindow(框架);
    frame.setVisible(true);
    }
    });
    }
    公共静态类主控扩展JPanel{
    私有静态最终长serialVersionUID=-4927941474660261348L;
    私有矩形closeRect;
    公共硕士(){
    addMouseListener(新MouseListener(){
    @凌驾
    公共无效mouseClicked(MouseEvent e){
    
    如果(e.getX()>=closeRect.getX()&&e.getY())不要覆盖顶级容器的
    update
    paint
    。请确保通过调用
    super.paint
    来维护绘制链的完整性。避免使用
    null
    布局,像素完美的布局在现代ui设计中是一种错觉。有太多的因素会影响每个容器的大小组件,所有组件都无法控制。Swing旨在与核心布局管理器配合使用,丢弃这些组件将导致无休止的问题,您将花费越来越多的时间试图解决这些问题。对尚未显示在屏幕上的组件调用
    重绘
    毫无意义
    静态
    不是你的朋友,这不是一种实现跨对象通信的方式,而是一种让你射中自己的脚并想知道自己为什么一瘸一拐的方式…@MadProgrammer,你介意扩展一点吗?你建议改变什么?“你建议改变什么?”-所有内容。
    paint
    在所有其他内容之上进行绘制,您应该使用
    JPanel
    并覆盖它的
    paintComponent
    方法在子组件下进行绘制。使用适当的布局管理器非常感谢dude:D
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.geom.RoundRectangle2D;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.EmptyBorder;
    
    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();
                    }
                    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                    GraphicsDevice gd = ge.getDefaultScreenDevice();
    
                    Login login = new Login();
                    JFrame frame = new JFrame("Project Zenith");
                    frame.setUndecorated(true);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(login);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
    //              gd.setFullScreenWindow(frame);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class Master extends JPanel {
    
            private static final long serialVersionUID = -4927941474660261348L;
    
            private Rectangle closeRect;
    
            public Master() {
    
                addMouseListener(new MouseListener() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getX() >= closeRect.getX() && e.getY() <= closeRect.getHeight()) {
                            closeClicked();
                        }
                    }
    
                    @Override
                    public void mouseEntered(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mouseExited(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mousePressed(MouseEvent arg0) {
    
                    }
    
                    @Override
                    public void mouseReleased(MouseEvent arg0) {
    
                    }
                });
            }
    
            @Override
            public void invalidate() {
                super.invalidate();
                closeRect = new Rectangle(getWidth() - 35, 0, 35, 35);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
                g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2d.setColor(new Color(168, 168, 168, 200));
                FontMetrics fm = g2d.getFontMetrics();
                int y = (getHeight() - fm.getHeight()) + fm.getAscent();
                g2d.drawString("Project Zenith", 10, y);
                g2d.setColor(new Color(0xFFA6A6));
                g2d.fill(closeRect);
            }
    
            public void closeClicked() {
                System.exit(0);
            }
        }
    
        public static class Login extends Master {
    
            private static final long serialVersionUID = 1L;
            private JTextField username;
            private JTextField password;
    
    
            Login() {
                Font inputFont = new Font("Calibri", Font.PLAIN, 15);
    
                setLayout(new GridBagLayout());
    
                JPanel content = new JPanel(new GridBagLayout()) {
                    @Override
                    protected void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        RoundRectangle2D loginRect = new RoundRectangle2D.Float(0, 0, getWidth() - 1, getHeight() - 1, 20, 20);
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.setColor(Color.WHITE);
                        g2d.fill(loginRect);
                        g2d.setColor(new Color(0xA8A8A8));
                        g2d.draw(loginRect);
                    }
                };
                content.setBorder(new EmptyBorder(20, 20, 20, 20));
    
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.insets = new Insets(0, 0, 25, 0);
    
                gbc.gridx = 0;
                gbc.gridy = 0;
    
                JLabel label = new JLabel("Access Terminal");
                label.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
                label.setForeground(new Color(0xA8A8A8));
    
                content.add(label, gbc);
    
                gbc.gridy++;
                username = new JTextField(25);
                username.setFont(inputFont);
                username.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                username.setEditable(true);
                username.setBackground(new Color(0xE6E6E6));
                //username.setVisible(true);
                content.add(username, gbc);
    
                gbc.gridy++;
                password = new JPasswordField(25);
                password.setFont(inputFont);
                password.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                password.setEditable(true);
                password.setBackground(new Color(0xE6E6E6));
                //password.setVisible(true);
                content.add(password, gbc);
    
                gbc.gridy++;
    
                JButton loginButton = new JButton("Login");
                loginButton.setFont(inputFont);
                loginButton.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
                loginButton.setBackground(new Color(0xE6E6E6));
                loginButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        System.out.println(username.getText());
                    }
                });
                content.add(loginButton, gbc);
    
                add(content);
    
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        }
    }