Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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 透明JPanel上的透明JTextField_Java_Swing_Jpanel_Jtextfield_Transparent - Fatal编程技术网

Java 透明JPanel上的透明JTextField

Java 透明JPanel上的透明JTextField,java,swing,jpanel,jtextfield,transparent,Java,Swing,Jpanel,Jtextfield,Transparent,不确定之前是否讨论过这个问题。但是我有一个奇怪的问题,在透明的JPanel上添加了透明的JTextFields。出于某种原因(我无法挖掘到足够的信息来找到原因),有更多的绘画被进行了。也许有一些肮脏的地区需要处理?不确定 让我举一个简单的例子: public class TextFieldGame extends JPanel { public static void main(String [] args){ SwingUtilities.invokeLater(n

不确定之前是否讨论过这个问题。但是我有一个奇怪的问题,在透明的JPanel上添加了透明的JTextFields。出于某种原因(我无法挖掘到足够的信息来找到原因),有更多的绘画被进行了。也许有一些肮脏的地区需要处理?不确定

让我举一个简单的例子:

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);
        }



    }

}
公共类TextFieldGame扩展了JPanel{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame someFrame=newjframe(“这很奇怪吗?”);
someFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
someFrame.setSize(200600);
添加(新的TextFieldGame());
someFrame.setVisible(true);
}
});
}
公共文本场游戏(){
setupContentPane();
}
私有void setupContentPane(){
setLayout(新的BorderLayout());
最终CanvasPanel CanvasPanel=新CanvasPanel();
添加(canvasPanel,BorderLayout.CENTER);
添加(新控制面板(canvasPanel),BorderLayout.SOUTH);
}
公共静态类控制面板扩展了JPanel{
私人最后拉票小组;
控制面板(CanvasPanel CanvasPanel){
this.canvasPanel=canvasPanel;
setupContentPane();
}
私有void setupContentPane(){
setLayout(新的FlowLayout(FlowLayout.RIGHT));
最终JButton载荷=新JButton(“载荷”);
添加(加载);
load.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
canvasPanel.addChildComponent(getComponent());
canvasPanel.revalidate();
canvasPanel.repaint();
}
});
}
私有JComponent getComponent(){
最终JPanel容器=新JPanel();
container.setLayout(新的BoxLayout(container,BoxLayout.PAGE_轴));
container.set不透明(false);
对于(int i=0;i<10;i++){
最终JTextField textField=新的JTextField(“为什么你没有工作?”){
@凌驾
公共维度getMaximumSize(){
返回新尺寸(Short.MAX_值,getPreferredSize().height);
}
};
textField.set不透明(false);
container.add(textField);
}
返回容器;
}
}
公共静态类CanvasPanel扩展了JPanel{
私有int paintCount=0;
游说小组(){
setupContentPane();
}
公共void setupContentPane(){
setLayout(新的BoxLayout(这是BoxLayout.PAGE_轴));
挫折地面(颜色:白色);
}
public void addChildComponent(JComponent组件){
组件设置对齐Y(顶部对齐);
添加(组件);
}
@凌驾
受保护组件(图形g){
超级组件(g);
System.out.println(“油漆计数:+++油漆计数);
}
}
}
我添加了System out语句以显示绘制任务的计数

首次装载时,将有2/3的油漆-足够公平。然后,如果要按“加载”按钮,10个透明的JTextFields将添加到一个透明的JPanel中,这个透明的JPanel将添加到CanvasPanel中。(Canvas panel又是JFrame的子部分)。您会注意到,完成此操作后,将完成11个额外的喷漆作业

但在理论上(我的理解是),按下“加载”按钮后,只能进行一次喷漆作业。这是因为,我只在CanvasPanel中添加了一个子项(这个子项本身可能有10个文本字段,但它们应该一次全部绘制)

为了验证我的理解,如果要使用10个jlabel而不是10个JTextFields,则在按下“Load”后只执行一个绘制作业。应该是这样的

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

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


请帮忙/

你为什么认为你在乎有多少油漆?一般来说,你无法控制这个数字。只是猜测,但可能透明组件会导致更多的绘制,因为它们后面的组件也必须绘制?为什么要计算组件绘制的次数?这是不必要的。JTextField需要支持闪烁插入符号。也许这就是区别。只要画的是正确的,这就没什么好担心的。还有一些其他的画的任务我需要执行,它们在每次刷新包含面板时都会执行。因此,这些额外的喷漆实际上会导致性能问题。请注意,这是我正在处理的一个更大应用程序的简单模拟示例。也许使用JTextfield来做我正在做的事情是不合适的。我可能应该使用JLabel,毕竟,我实际上是在将所有文本字段的编辑设置为false(而不是在模拟中)(顺便说一句,闪烁的光标不会显示在不可编辑的文本字段上,但它仍然会额外绘制它)好吧,就像我们所说的,您实际上无法控制绘制。事实上,在不同的计算机、操作系统、JRE版本上,甚至在同一台计算机上的不同时间,您可能会得到完全不同的数字,这取决于其他情况。如果绘制代码的调用相差10次会导致性能问题,那么您将面临更大的问题