繁体   English   中英

Java-顶部的GridBagLayout组件在调整大小时消失

[英]Java - GridBagLayout components on top disappear on resize

我使用一个JLabel并在其前面使用一个JTextField以便可以用值表示类似防御的状态。 我使用以下代码:

    setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(10, 10, 10, 10);

    JLabel jl = new JLabel();
    ImageIcon ii = new ImageIcon("C:\\Users\\Max\\Desktop\\shield.png");
    jl.setIcon(ii);
    gbc.gridy = 0;
    gbc.gridx = 0;
    add(jl, gbc);

    gbc.insets = new Insets(5, 10, 10, 10);
    JTextField jtf = new JTextField(2);
    jtf.setHorizontalAlignment(JTextField.CENTER);
    gbc.ipadx = 10;
    gbc.ipady = 10;
    gbc.gridy = 0;
    gbc.gridx = 0;
    jtf.setFocusable(false);
    add(jtf, gbc);

得到: 在此处输入图片说明

一切都很好,但是,如果我尝试调整窗口大小,则JTextField永远消失,仅显示JLabel 为什么会这样?

  1. 标签的位置与文本字段的位置之间没有关系,这意味着标签和字段可以自由移动,彼此独立
  2. 存在z顺序问题,容器顺序较低的组件在容器顺序较高的组件之后(反向)涂上油漆,这意味着在更新整个容器时,实际上是在屏蔽之前涂了标签。 它有时可能起作用的原因是,组件实际上可以彼此独立地绘制,这意味着可以实际绘制文本字段而无需通知父容器或标签

例如...

屏蔽

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
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();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.insets = new Insets(5, 10, 10, 10);
            JTextField jtf = new JTextField(2);
            jtf.setHorizontalAlignment(JTextField.CENTER);
            gbc.ipadx = 10;
            gbc.ipady = 10;
            gbc.gridy = 0;
            gbc.gridx = 0;
            jtf.setFocusable(false);
            add(jtf, gbc);

            gbc = new GridBagConstraints();
            try {
                JLabel jl = new JLabel();
                ImageIcon ii = new ImageIcon(ImageIO.read(getClass().getResource("/shield01.png")));
                jl.setIcon(ii);
                gbc.gridy = 0;
                gbc.gridx = 0;
                add(jl, gbc);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }

}

可能更好的解决方案是创建一个“背景”组件,该组件拍摄一张图像并将其绘制为该组件的背景,然后向其中添加文本字段。

背景

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class TestBackground {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());

            try {
                BackgroundPane pane = new BackgroundPane(ImageIO.read(getClass().getResource("/shield02.png")));
                pane.setLayout(new GridBagLayout());
                pane.setBorder(new EmptyBorder(5, 5, 5, 5));
                GridBagConstraints gbc = new GridBagConstraints();

                JTextField jtf = new JTextField(2);
                jtf.setHorizontalAlignment(JTextField.CENTER);
                gbc.ipadx = 10;
                gbc.ipady = 10;
                gbc.gridy = 0;
                gbc.gridx = 0;
                jtf.setFocusable(false);
                pane.add(jtf, gbc);

                add(pane);
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

    }

    public class BackgroundPane extends JPanel {

        private BufferedImage img;

        public BackgroundPane(BufferedImage img) {
            this.img = img;
        }

        @Override
        public Dimension getPreferredSize() {
            return img != null ? new Dimension(img.getWidth(), img.getHeight()) : super.getPreferredSize();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                int x = (getWidth() - img.getWidth()) / 2;
                int y = (getHeight() - img.getHeight()) / 2;
                g.drawImage(img, x, y, this);
            }
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM