透明JPAnel上的透明JTextField

时间:2014-01-30 16:37:24

标签: java swing jpanel jtextfield transparent

不确定之前是否已经讨论过这个问题。但是我在透明的JPanel上添加透明的JTextField有一个奇怪的问题。由于某种原因(我无法挖掘到足以找到原因),还有其他画作可以实现。也许有些脏区需要处理?不确定。

让我举一个简单的例子:

public class TextFieldGame extends JPanel {

    public static void main(String [] args){

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame someFrame = new JFrame("Is this odd?");
                someFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                someFrame.setSize(200,600);

                someFrame.add(new TextFieldGame());

                someFrame.setVisible(true);
            }
        });

    }

    public TextFieldGame() {
        setupContentPane();
    }

    private void setupContentPane() {
        setLayout(new BorderLayout());

        final CanvasPanel canvasPanel = new CanvasPanel();
        add(canvasPanel, BorderLayout.CENTER);
        add(new ControlPanel(canvasPanel), BorderLayout.SOUTH);
    }

    public static class ControlPanel extends JPanel {

        private final CanvasPanel canvasPanel;

        ControlPanel(CanvasPanel canvasPanel) {
            this.canvasPanel = canvasPanel;
            setupContentPane();
        }

        private void setupContentPane() {
            setLayout(new FlowLayout(FlowLayout.RIGHT));

            final JButton load = new JButton("load");
            add(load);

            load.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    canvasPanel.addChildComponent(getComponent());

                    canvasPanel.revalidate();
                    canvasPanel.repaint();
                }
            });

        }

        private JComponent getComponent() {


            final JPanel container = new JPanel();
            container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
            container.setOpaque(false);
            for (int i = 0; i < 10; i++) {
                final JTextField textField = new JTextField("why you no work?") {
                    @Override
                    public Dimension getMaximumSize() {
                        return new Dimension(Short.MAX_VALUE, getPreferredSize().height);
                    }
                };

                textField.setOpaque(false);

                container.add(textField);

            }
            return container;
        }
    }

    public static class CanvasPanel extends JPanel {
        private int paintCount = 0;

        CanvasPanel() {
            setupContentPane();
        }

        public void setupContentPane() {
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

            setBackground(Color.white);
        }

        public void addChildComponent(JComponent component) {
            component.setAlignmentY(TOP_ALIGNMENT);
            add(component);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            System.out.println("paint count: " + ++paintCount);
        }



    }

}

我添加了System out语句来显示绘制任务的计数。

首次加载时,会有2/3种颜料 - 足够公平。然后,如果要按“加载”按钮,10个透明的JTextField将被添加到透明的JPanel中,这个透明的JPanel将被添加到CanvasPanel中。 (Canvas面板又是JFrame的子代)。你会注意到这样做,将完成11个额外的油漆工作。

但是在按下“加载”之后理论上(在我的理解中),只应执行一个油漆工作。那是因为,我只向CanvasPanel添加了一个孩子(孩子本身可能有10个文本域,但它们都应该一次性绘制)。

为了测试我的理解,如果您要使用10个JLabel而不是10个JTextField,则在按下“Load”后只执行一个绘制作业。它应该是什么。

此外,如果要保持JTextField不透明,则只执行一个绘制作业。 (刚刚测试过,如果使用JTextArea代替JTextField,则完成一次绘制)

发生了什么事?请注意,默认情况下JLabel是透明的,因此我不确定为什么JTextField组件的透明度会导致这些额外的绘制。

请帮助/

0 个答案:

没有答案