有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Motif L&F中自定义组合框渲染器中的Java Swing消失文本

我目前正在为JComboBox编写一个自定义ListCellRenderer。为此,我使用一个系统来获取一个新的渲染器,只要L&;F更改,并将该方法委托给此。这在所有L&;财政司司长。然而,当我把这个组件放在面板中(这样我可以添加更多的组件),它在金属和Windows L&;Fs,但JComboBox文本在Motif中消失。请参见屏幕截图和代码:

Problem with the third renderer

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TextDemo extends JPanel implements ActionListener {

    private static JFrame frame;

    public TextDemo() {
        super(new GridBagLayout());

        JComboBox correct = new JComboBox(new String[]{"One", "Two", "Three"});

        JComboBox alsoCorrect = new JComboBox(new String[]{"One", "Two", "Three"});
        alsoCorrect.setRenderer(new MyRenderer());

        JComboBox incorrect = new JComboBox(new String[]{"One", "Two", "Three"});
        incorrect.setRenderer(new NotWorkingRenderer());

        JButton button = new JButton("Change LnF");
        button.addActionListener(this);

        add(correct, getConstraints(0));
        add(alsoCorrect, getConstraints(1));
        add(incorrect, getConstraints(2));
        add(button, getConstraints(3));
    }

    private GridBagConstraints getConstraints(int y) {
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0; c.gridy = y;
        c.insets = new Insets(4,8,4,8);
        c.weightx = 1.0; c.weighty = 1.0;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        return c;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
            SwingUtilities.updateComponentTreeUI(frame);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static void createAndShowGUI() {
        frame = new JFrame("TextDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TextDemo());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class MyRenderer implements ListCellRenderer {
    protected static ListCellRenderer delegate;
    static {
        refreshRenderers();
        UIManager.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals("lookAndFeel")) {
                    refreshRenderers();
                }
            }
        });
    }
    protected static void refreshRenderers() {
        delegate = new JComboBox().getRenderer();
    }
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        return delegate.getListCellRendererComponent(list, value,
                index, isSelected, cellHasFocus);
    }
}

class NotWorkingRenderer extends MyRenderer {
    private JPanel panel = new JPanel();
    public NotWorkingRenderer() {
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
    }
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
                    panel.removeAll();
        panel.add(c);
        return panel;
    }
}

如果您能帮助我们理解为什么会发生这种情况,我们将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    您返回的是panel,而不是c

    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
                        panel.removeAll();
            panel.add(c);
            return c;
    
  2. # 2 楼答案

    没有答案

    • 但是看看会发生什么,用JPanel作为JComboBox的渲染器JComponents

    • 您确定带字符串值的JPanel是正确的方法吗?请说明目标是什么,

    • 默认JLabel,(J)组件而不是JPanel是否具有相同的效果

    enter image description hereenter image description hereenter image description here

    源代码

    import java.awt.*;
    import java.awt.event.*;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    
    import javax.swing.*;
    
    public class TextDemo extends JPanel implements ActionListener {
    
        private static JFrame frame;
    
        public TextDemo() {
            super(new GridBagLayout());
            JComboBox correct = new JComboBox(new String[]{"One", "Two", "Three"});
            JComboBox alsoCorrect = new JComboBox(new String[]{"One", "Two", "Three"});
            alsoCorrect.setRenderer(new MyRenderer());
            JComboBox incorrect = new JComboBox(new String[]{"One", "Two", "Three"});
            incorrect.setRenderer(new NotWorkingRenderer());
            JButton button = new JButton("Change LnF");
            button.addActionListener(this);
            add(incorrect, getConstraints(0));
            add(correct, getConstraints(1));
            add(alsoCorrect, getConstraints(2));
            add(button, getConstraints(3));
        }
    
        private GridBagConstraints getConstraints(int y) {
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = y;
            c.insets = new Insets(4, 8, 4, 8);
            c.weightx = 1.0;
            c.weighty = 1.0;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.anchor = GridBagConstraints.FIRST_LINE_START;
            return c;
        }
    
        @Override
        public void actionPerformed(ActionEvent ev) {
            try {
                UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                SwingUtilities.updateComponentTreeUI(frame);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        private static void createAndShowGUI() {
            frame = new JFrame("TextDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new TextDemo());
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                //SwingUtilities.updateComponentTreeUI(frame);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    
    class MyRenderer implements ListCellRenderer {
    
        protected static ListCellRenderer delegate;
    
        static {
            refreshRenderers();
            UIManager.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if (evt.getPropertyName().equals("lookAndFeel")) {
                        refreshRenderers();
                    }
                }
            });
        }
    
        protected static void refreshRenderers() {
            delegate = new JComboBox().getRenderer();
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            return delegate.getListCellRendererComponent(list, value,
                    index, isSelected, cellHasFocus);
        }
    }
    
    class NotWorkingRenderer extends MyRenderer {
    
        private JPanel panel = new JPanel();
    
        public NotWorkingRenderer() {
            panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
            panel.add(c);
            return panel;
        }
    }
    

    首先编辑

    • 所有标准L&;F不包括ModifL&;F正确显示

    • 前进一步???,代码行incorrect.setEditable(true);生成

    enter image description here

    • 很抱歉,我不知道莫迪夫的正确方法;F和不可编辑JComboBox

    编辑第2页

    • 我是瞎子,皮普。。。皮普。。。皮普

    • phaaa我从来没有参与过{}/{}/{}{}在{}中,但是关于是否可能,

    enter image description here

    class NotWorkingRenderer extends BasicComboBoxRenderer {
    
        private JPanel panel = new JPanel();
    
        public NotWorkingRenderer() {
            panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
            //panel.setOpaque(false);
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));        
            panel.removeAll();
            panel.add(c);
            panel.revalidate();
            panel.repaint();
            return panel;
        }
    }