在JFrame上定位JButton不会显示



我知道这是可怕的编码,但我迫切需要解决这个问题。我已经尝试了多种方法来定位按钮,但按钮仍然停留在顶部中心,所有其他按钮都排在它后面。

import javax.imageio.ImageIO;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.io.IOException;
import java.net.URL;
public class Template extends JFrame {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
    JFrame frame = new JFrame("The Impossible Quiz");//Construct JFrame
    frame.setLayout(null);//manual setting for button placement
    frame.setContentPane(new JPanel() {//sets panel as background
        BufferedImage image = ImageIO.read(new URL("https://pbs.twimg.com/media/BoyFVfXIUAA0Tik.png"));//uses url image 
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, 1360, 690, this);//sets image as jframe background
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//closes jframe when press exit
    frame.setSize(1365, 730);//sets size of jframe
    JPanel buttonpanel = new JPanel();//sets panel for all buttons
    buttonpanel.setBounds(0, 0, 1460, 690);//sets placing and sizing of panel
    buttonpanel.setOpaque(false);//makes panel transparent
    JButton next = new JButton ("Start");//contructs correct start button
    next.setBounds(10, 5, 40, 50);
    buttonpanel.add(next);//adds button to panel
    next.addActionListener(new ActionListener()//adds actionlistener to button
    {
        public void actionPerformed(ActionEvent e)
        {
            new Introduction();//continues to next question
        }
    });
    JButton wrongstart = new JButton("Start!!");//constructs wrong start button
    wrongstart.setSize(100, 400);//setes size of button
    buttonpanel.add(wrongstart);//adds button to panel
    wrongstart.addActionListener(new ActionListener()//adds actionlistener to button
    {
        public void actionPerformed(ActionEvent e)
        {
            new Wrong();//direct user to wrong panel
        }
    });
    frame.add(buttonpanel);//adds panel to jframe
    frame.setVisible(true);//sets jframe as visible
}
}

你的问题是,你试图使用绝对定位来定位组件(你的JButton)在一个容器(包含JPanel)使用FlowLayout作为默认值,和FlowLayout完全忽略组件的边界。一个快速的解决方案是将JPanel的布局设置为null,以允许绝对定位。一个正确的解决方案是始终避免空布局和绝对定位,而是使用嵌套的jpanel,每个jpanel使用自己的布局,以创建复杂但灵活和令人愉悦的GUI。


你正在将JFrame contentPane的布局设置为null——也不要这样做。
然后添加一个JPanel作为contentPane它使用默认的FlowLayout——不要那样做。让contentPane的布局为BorderLayout。


编辑
例如,如果我们让contentPane单独使用它的BorderLayout,并在它的顶部添加另一个图像面板,一个使用griddbaglayout,我们可以很容易地定位我们的JButton到GUI的左上角,如果需要. ....

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class Template2 extends JPanel {
   private static final int PREF_W = 1460;
   private static final int PREF_H = 690;
   private BufferedImage img;
   private JButton startButton = new JButton("Start");
   public Template2() {
      setLayout(new GridBagLayout());
      // TODO: .... read in your image here
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 1;
      gbc.gridy = 1;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.insets = new Insets(5, 10, 0, 0);
      gbc.anchor = GridBagConstraints.NORTHWEST;
      gbc.fill = GridBagConstraints.NONE;
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      add(startButton, gbc);
   }
   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
   @Override
   public void paintComponents(Graphics g) {
      super.paintComponents(g);
      if (img != null) {
         g.drawImage(img, 0, 0, this);
      }
   }
   private static void createAndShowGui() {
      Template2 mainPanel = new Template2();
      JFrame frame = new JFrame("Some Horrendous Program");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

相关内容

  • 没有找到相关文章

最新更新