Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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 BuffereImage上的按钮透明度_Java_Swing_Transparency_Jbutton_Bufferedimage - Fatal编程技术网

Java BuffereImage上的按钮透明度

Java BuffereImage上的按钮透明度,java,swing,transparency,jbutton,bufferedimage,Java,Swing,Transparency,Jbutton,Bufferedimage,我有一个问题: 我正在JFrame中渲染BuffereImage。然后在同一帧中添加一个JButton。 当我尝试使按钮透明时,按钮变为透明,但不管它的实际位置如何,它总是透明的,就像它卡在框架的左上角一样。 我测试了一些使按钮透明的不同方法,结果总是一样的 有什么想法吗 谢谢 public class TestPanel extends JPanel { public TestPanel(){ JButton foo = new JButton("test"); foo.se

我有一个问题:

我正在JFrame中渲染BuffereImage。然后在同一帧中添加一个JButton。 当我尝试使按钮透明时,按钮变为透明,但不管它的实际位置如何,它总是透明的,就像它卡在框架的左上角一样。 我测试了一些使按钮透明的不同方法,结果总是一样的

有什么想法吗

谢谢

public class TestPanel extends JPanel {

public TestPanel(){
    JButton foo = new JButton("test");
    foo.setBackground(new Color(0, 0, 0, 0));
    foo.setBounds(20, 100, 300, 50);
    this.add(foo);
}

public void paint(Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(ImageFactory.getImg(), 0, 0, null); //get a BufferedImage
    g2.dispose();
}

}

我发现了几个问题,即使我不确定是哪个问题导致了您的问题。我尝试按顺序列出这些问题:

  • 您的
    TestPanel
    没有指定
    LayoutManager
    (我希望您在代码的其他地方指定它)
  • 您正在扩展一个
    JPanel
    ,而不调用super-paintComponent方法(不要使用paint)。在使用paintComponent方法之前,应先执行此操作:

    public void paintComponent(Graphics g){
        super.paintComponent(g); 
    }
    
  • 删除dispose方法调用。不得破坏图形对象

  • 编辑:

  • 这是一个问题:

    foo.setBounds(20, 100, 300, 50);
    
    您正在尝试显式设置JButton的边界。你不应该那样做。如果您使用的是LayoutManager,它可能会忽略此指令。如果您使用的是空布局,这也可能是一个问题

  • setBound()。你的代码没有这样说。
    现在,
    JPanel
    的默认布局管理器是。默认情况下,此布局管理器将从左到右再从上到下排列组件

    现在,让您的代码按预期工作。在构造函数中添加这一行:
    setLayout(null)
    。 但是请记住,将布局设置为null是一种非常糟糕的做法。 此外,海森堡提到的几点非常值得一提。试着遵循它们。

    几个问题

    • 替代paint而替代paintComponent是错误的
    • 该按钮具有完全透明的背景,但对于不透明,返回true,从而愚弄了绘制机制
    • 处理作为参数传入的图形是错误的
    工作代码(编辑:意外删除透明颜色设置行,已修复)


    正如其他人已经指出的:布局管理器在Swing/AWT中是必须的-不使用它们会使ui代码脆弱且难以维护。

    我认为布局问题与布局管理器问题有关。您正在指定布局管理器吗?如果是,哪一个,在哪里,如何?发布相关代码。@Heisenbug请将paint()方法(以及两者)更改为paintComponent():-)+1它不是“不需要销毁”,而是“不得销毁”:)好的,修复了。问题确实是空布局。现在,将“不透明”设置为false和透明背景色时,它可以完美地工作。谢谢-1“.只有当您将布局设置为null时,才会工作”…此时,其他所有操作都将开始失败。使用布局。@安德鲁:谢谢你的观点。我想说的是“如果布局为空,setBound()将有效”。现在同意吗?:)不会改变这样一个事实:将布局设置为null是一个坏主意。“现在同意了吗?”安德鲁:哦。我误解了你的第一句话。我在回答中还提到,这是一个非常糟糕的想法:“但请记住,将布局设置为null是一个非常糟糕的做法”。我只是想弄清楚为什么代码没有按预期工作。甚至我也推荐了海森堡的解决方案,后来被接受了。
    public TestPanel(){
        JButton foo = new JButton("test");
        foo.setBackground(new Color(0, 0, 0, 0));
        foo.setOpaque(false);
        foo.setBorder(BorderFactory.createLineBorder(Color.RED));
        this.add(foo);
    }
    
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(ImageFactory.getImg(), 0, 0, null); //get a BufferedImage
       //   g2.dispose();
    }