Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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 Swing按钮消失_Java_Swing_Jbutton - Fatal编程技术网

Java Swing按钮消失

Java Swing按钮消失,java,swing,jbutton,Java,Swing,Jbutton,我试图在绘制的按钮所在的位置创建一个不可见的按钮,但是当我尝试添加按钮时,它几乎每次运行程序时都会消失,当它可见时,它会在“调整大小”上变为不可见。请帮帮我,怎么了 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt

我试图在绘制的按钮所在的位置创建一个不可见的按钮,但是当我尝试添加按钮时,它几乎每次运行程序时都会消失,当它可见时,它会在“调整大小”上变为不可见。请帮帮我,怎么了

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

public class Main extends JFrame
{
    public static final int VERSION = 1;
    private static final long serialVersionUID = 1L;
    private Image img;
    private boolean hasMouseListener = false;
    private Image bgImage;

    public static int ii;
    public static int jj;


    public Main() throws IOException
    {
        super("Unigin Alpha 1.0.0"); //Set title


        ii = this.getWidth();
        jj = this.getHeight();

        setBackground(Color.WHITE);
        //loginForm1 = new LoginForm(this);
        JPanel localJPanel = new JPanel();
        //localJPanel.setLayout(null);
        setVisible(true); 
        setTitle("Unigin");

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        localJPanel.setPreferredSize(new Dimension(854, 480));

        setLayout(new FlowLayout());
        add(localJPanel, "Center");

        //-------------------------------------------------------------------------
        JButton bb = new JButton("HEEL");
        localJPanel.add(bb, "CENTER");
        //bb.setLocation(getWidth()/2-76-8, getHeight()/2); Doesn't work!
        //i / 2 - 76 - 8, j / 2, 76, 20

        pack();
        setLocationRelativeTo(null);
        try
        {
          setIconImage(ImageIO.read(Main.class.getResource("favicon.png")));
        } catch (IOException localIOException) {
          localIOException.printStackTrace();
        }

        super.paint(getGraphics());
    }





    public void paint(Graphics paramGraphics)
      {
        try {
            bgImage = ImageIO.read(Main.class.getResource("wool_red.png")).getScaledInstance(32, 32, 16);
          } catch (IOException localIOException) {
            localIOException.printStackTrace();
          }

        int i = getWidth() / 2;
        int j = getHeight() / 2;
        if ((img == null) || (img.getWidth(null) != i) || (img.getHeight(null) != j)) {
          img = createVolatileImage(i, j);
        }

        Graphics localGraphics = img.getGraphics();
        for (int k = 0; k <= i / 32; k++)
          for (int m = 0; m <= j / 32; m++)
            localGraphics.drawImage(bgImage, k * 32, m * 32, null);
        String str;
        FontMetrics localFontMetrics;

        if (true) {
          if (!hasMouseListener) {
            hasMouseListener = true;
            //addMouseListener(this);
          }
          localGraphics.setColor(Color.WHITE);
          str = "Bukkit Unigin";
          localGraphics.setFont(new Font(null, 1, 20));
          localFontMetrics = localGraphics.getFontMetrics();
          localGraphics.drawString(str, i / 2 - localFontMetrics.stringWidth(str) / 2, j / 2 - localFontMetrics.getHeight() * 2);

          localGraphics.setColor(Color.LIGHT_GRAY);
          localGraphics.setFont(new Font(null, 0, 12));
          localFontMetrics = localGraphics.getFontMetrics();

          localGraphics.setColor(Color.LIGHT_GRAY);


          localGraphics.fill3DRect(i / 2 - 76 - 8, j / 2, 76, 20, true);
          localGraphics.fill3DRect(i / 2 + 8, j / 2, 76, 20, true);
          //localGraphics.fill3DRect(x,y,width,height,true);

          localGraphics.setColor(Color.WHITE);
          str = "What do you want to do?";
          localGraphics.drawString(str, i / 2 - localFontMetrics.stringWidth(str) / 2, j / 2 - 8);

          localGraphics.setColor(Color.BLACK);
          str = "New plugin";
          localGraphics.drawString(str, i / 2 - 56 - 18 - localFontMetrics.stringWidth(str) / 2 + 28, j / 2 + 14);
          str = "Load plugin";
          localGraphics.drawString(str, i / 2 + 18 - localFontMetrics.stringWidth(str) / 2 + 28, j / 2 + 14);
        }

        localGraphics.dispose();
        paramGraphics.drawImage(img, 0, 0, i * 2, j * 2, null);


      }

    public static void main(String[] args) throws IOException {

        new Main();



    }
}
导入javax.imageio.imageio;
导入javax.swing.*;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.io.IOException;
公共类主框架
{
公共静态最终int版本=1;
私有静态最终长serialVersionUID=1L;
私有图像img;
私有布尔hasMouseListener=false;
私有图像;
公共静态int ii;
公共静态int jj;
public Main()引发IOException
{
超级(“Unigin Alpha 1.0.0”);//设置标题
ii=这个.getWidth();
jj=this.getHeight();
挫折地面(颜色:白色);
//loginForm1=新的LoginForm(此);
JPanel localJPanel=新的JPanel();
//localJPanel.setLayout(null);
setVisible(真);
setTitle(“Unigin”);
setDefaultCloseOperation(关闭时退出);
localJPanel.setPreferredSize(新维度(854480));
setLayout(新的FlowLayout());
添加(localJPanel,“中心”);
//-------------------------------------------------------------------------
JButton bb=新JButton(“鞋跟”);
localJPanel.add(bb,“中心”);
//setLocation(getWidth()/2-76-8,getHeight()/2);不起作用!
//i/2-76-8,j/2,76,20
包装();
setLocationRelativeTo(空);
尝试
{
setIconImage(ImageIO.read(Main.class.getResource(“favicon.png”));
}捕获(IOException localIOException){
localIOException.printStackTrace();
}
super.paint(getGraphics());
}
公共空白绘制(图形)
{
试一试{
bgImage=ImageIO.read(Main.class.getResource(“wool_red.png”)).getScaledInstance(32,32,16);
}捕获(IOException localIOException){
localIOException.printStackTrace();
}
int i=getWidth()/2;
int j=getHeight()/2;
if((img==null)| |(img.getWidth(null)!=i)| |(img.getHeight(null)!=j)){
img=创建挥发年龄(i,j);
}
Graphics localGraphics=img.getGraphics();

对于(int k=0;k当您调整帧大小时,绘制将消失,因为您没有覆盖
JComponent
paintComponent
,您有一个名为paint的方法,该方法在构造函数调用时运行一次

相反,将应用程序划分为单独的类,每个类处理的责任较少。其中一个类需要重写paintComponent()以实际绘制按钮


如果要制作不可见的JButton,请按照Swing教程进行自定义绘制:

JButton invisibleButton = new JButton(){
     @Override
     protected void paintComponent(Graphics g){}; 
};
修正1: 从构造函数中删除
super.paint(getGraphics());

原因:您永远不应该这样做。尽管在这种情况下不需要重新绘制,但建议使用repaint()


修正2: 在重写的绘制方法的末尾调用super.paint(g)

原因:此方法负责绘制子对象(本例中为您的按钮)。如果不在每次绘制框架时调用该按钮,则不会显示该按钮


修正案3: 在构造函数中调用
setBackGround(newjava.awt.Color(0,0,0,0));

原因:如果不这样做,
super.paint(g);
将删除手动绘制的所有内容


就我个人而言,我建议使用JPanel进行自定义绘制。它的绘制机制更干净(单独的paintComponent、paintBorder、paintChildren方法)

祝你好运。

  • 不要使用
    getGraphics
    ,它不可靠,这不是自定义绘制的方式
  • 永远不要自己调用
    paint
    。您不负责执行绘制操作,这是
    repaitmanager
  • 不要中断绘制链,在重写绘制方法时始终调用
    super.paintXxx
    。绘制过程是一系列复杂的链式方法调用,它们一起工作以生成输出。应避免重写顶级容器的
    paint
    ,顶级容器是一系列复杂的组件,超过iding
    paint
    可以像您在这里所做的那样轻松破坏此设计。它们也不是双缓冲的
  • 避免在任何
    paintXxx
    方法中加载资源或执行任何耗时的操作。绘制操作旨在快速返回。否则将显著减慢重新绘制过程
基本上,通过断开绘制链,您已经阻止了绘制过程能够渲染帧的子组件。即使您调用了
super.paint
,也会遇到问题,因为您要么在先前绘制的顶部绘制,要么绘制过程会清除之前绘制的内容。。。(更不用说,
JFrame
在添加任何内容之前,至少有三层其他容器位于其顶部)

从分离程序逻辑开始。关注“图像”的需要,渲染到自定义组件,从
JPanel
扩展,但覆盖它的
paintComponent
方法

将此添加到您的框架(可能作为内容窗格)。将其他控件添加到其中


查看并获取有关绘画工作原理的更多详细信息,以及了解Swing中顶级容器的复杂性质

我将如何解决此问题?是否要隐藏或不可见按钮?它仍然无法工作,我无法设置背景,因为框架已装饰且