Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java组件在启动时不显示_Java_Swing - Fatal编程技术网

Java组件在启动时不显示

Java组件在启动时不显示,java,swing,Java,Swing,我有一个类,它在文本字段的东边添加了一个ImageIcon,如果你将它传递给该类,它在运行时可以很好地工作,如果我按下一个按钮来更改帧,但是图像在启动时不会显示 import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.Act

我有一个类,它在文本字段的东边添加了一个ImageIcon,如果你将它传递给该类,它在运行时可以很好地工作,如果我按下一个按钮来更改帧,但是图像在启动时不会显示

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class TestStartFrame extends JFrame
{

/**
 * 
 */
private static final long serialVersionUID = 1L;
private JPanel contentPane;

public static void main(String[] args)
{
    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            try
            {
                TestStartFrame frame = new TestStartFrame();
                frame.setVisible(true);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public TestStartFrame()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JButton btnNewButton = new JButton("New button");
    contentPane.add(btnNewButton, BorderLayout.CENTER);
    btnNewButton.addActionListener(new ActionListener()
    {

        @Override
        public void actionPerformed(ActionEvent e)
        {
            SecondFrame fr = new SecondFrame();
            fr.setVisible(true);
            try
            {
                int r = 250;
                int g = 250;
                int b = 250;
                UIManager.put("control", new Color(r, g, b));
                UIManager
                        .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                UIManager.put("control", new Color(r, g, b));
                SwingUtilities
                        .updateComponentTreeUI(SecondFrame.contentPane);
            } catch (Exception e1)
            {
                System.out.println(e1.getMessage());
            }
            dispose();
        }
    });

}

}

class SecondFrame extends JFrame
{
/**
 * 
 */
private static final long serialVersionUID = 1L;
public final static JPanel contentPane = new JPanel();

/**
 * Create the frame.
 */
public SecondFrame()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout());
    JTextField txt = new JTextField();
    contentPane.add(txt, BorderLayout.CENTER);
    txt = ClearImage.addImage(txt);

}
}

class ClearImage
{

public static JTextField addImage(final JTextField comp)
{

    Image image = new BufferedImage(10, 25, BufferedImage.TYPE_INT_RGB);
    Graphics graphics = image.getGraphics();
    graphics.setColor(Color.WHITE);
    graphics.fillRect(0, 0, 10, 25);
    graphics.setColor(Color.LIGHT_GRAY);
    graphics.fillOval(0, 7, 10, 10);
    graphics.setColor(Color.GRAY);
    graphics.drawLine(2, 9, 8, 15);
    graphics.drawLine(2, 15, 8, 9);

    JLabel lblClear = new JLabel(new ImageIcon(image));
    comp.setLayout(new BorderLayout());
    comp.add(lblClear, BorderLayout.EAST);

    lblClear.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    lblClear.addMouseListener(new MouseAdapter()
    {
        @Override
        public void mouseClicked(MouseEvent e)
        {
            comp.setText("");
        }
    });

    return comp;

}

public static JTextField removeImage(final JTextField comp)
{
    comp.removeAll();
    return comp;
}

}

如果我将UI更改放在框架可见之前,我没有这个问题,有人能解释一下为什么会这样吗?

您的问题是由
JTextField
上的UI工厂更改引起的(这是由安装Nimbus L&F和
updateComponentTreeUI()
触发的)

在第二次调用中执行此操作时,您将自动卸载
JTextField
的上一个L&F和UI工厂。默认情况下,这是Metal L&F文本UI(
MetalTextFieldUI
),它扩展了
BasicTextUI
。这将调用方法
javax.swing.plaf.basic.BasicTextUI.uninstallUI(JComponent)
,其内容如下:

public void uninstallUI(JComponent c) {
        // detach from the model
        editor.removePropertyChangeListener(updateHandler);
        editor.getDocument().removeDocumentListener(updateHandler);

        // view part
        painted = false;
        uninstallDefaults();
        rootView.setView(null);
        c.removeAll();
        LayoutManager lm = c.getLayout();
        if (lm instanceof UIResource) {
            c.setLayout(null);
        }

        // controller part
        uninstallKeyboardActions();
        uninstallListeners();

        editor = null;
    }
请注意调用
c.removeAll()
,它基本上会从层次结构中删除标签,从而导致您看到的问题

  • 可以说,将组件添加到原始Swing小部件并不理想,这不是它们的预期用途。我个人觉得这个论点很弱,但我知道很多荡秋千的爱好者都有这种想法

  • 只需确保在添加
    JLabel
    或扩展
    JTextField
    之前更新UI,并在更新UI后,在
    JTextField
    中重新安装
    JLabel

  • 小示例(仅演示我的解释):


    addImage()
    在代码段中没有调用任何内容。是的,没有在那里调用,但在我启动时调用。我可以查看system.out.println并查看布局是否在开始时设置,只是组件没有显示…您是否可以添加main方法以查看它是如何初始化的?初始化用户界面后,您应该尝试调用
    yourFrameClass.revalidate()
    。也许这解决了你的问题。不知道,但是你可以考虑看看Saviglab SWIXX库中的BudDebug API(OH重新验证和重新绘制可能不是一个坏主意)。
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.EmptyBorder;
    
    public class TestAddImageToTextField {
    
        private static class MyJTextField extends JTextField {
            @Override
            public void updateUI() {
                removeAll();
                super.updateUI();
                Image image = buildImage();
    
                JLabel lblClear = new JLabel(new ImageIcon(image));
                lblClear.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        MyJTextField.this.setText("");
                    }
                });
                setLayout(new BorderLayout());
                add(lblClear, BorderLayout.EAST);
            }
    
            private Image buildImage() {
                Image image = new BufferedImage(10, 25, BufferedImage.TYPE_INT_RGB);
                Graphics graphics = image.getGraphics();
                graphics.setColor(Color.WHITE);
                graphics.fillRect(0, 0, 10, 25);
                graphics.setColor(Color.LIGHT_GRAY);
                graphics.fillOval(0, 7, 10, 10);
                graphics.setColor(Color.GRAY);
                graphics.drawLine(2, 9, 8, 15);
                graphics.drawLine(2, 15, 8, 9);
                return image;
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        TestAddImageToTextField frame = new TestAddImageToTextField();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        private JComponent contentPane;
    
        /**
         * Create the frame.
         * 
         * @throws UnsupportedLookAndFeelException
         * @throws IllegalAccessException
         * @throws InstantiationException
         * @throws ClassNotFoundException
         */
        public TestAddImageToTextField() throws ClassNotFoundException, InstantiationException, IllegalAccessException,
                UnsupportedLookAndFeelException {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(100, 100, 450, 300);
            contentPane = (JComponent) frame.getContentPane();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            MyJTextField comp = new MyJTextField();
    
            contentPane.add(comp);
            frame.setVisible(true);
            installNimbusLAF();
    
        }
    
        private void installNimbusLAF() throws ClassNotFoundException, InstantiationException, IllegalAccessException,
                UnsupportedLookAndFeelException {
            int r = 250;
            int g = 250;
            int b = 250;
            UIManager.put("control", new Color(r, g, b));
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            UIManager.put("control", new Color(r, g, b));
            SwingUtilities.updateComponentTreeUI(contentPane);
        }
    
    }