Pregunta

Sé que esta es una codificación horrible, pero necesito desesperadamente solucionar este problema.He intentado varias formas de intentar colocar el botón, pero el botón aún permanece en la parte superior central con todos los demás botones alineados después.

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
}

}
¿Fue útil?

Solución

Su problema es que está intentando usar el posicionamiento absoluto para colocar un componente (su JButton) en un contenedor (el JPanel que lo contiene) que usa FlowLayout como predeterminado, y FlowLayout ignora por completo los límites de los componentes.Una solución rápida es establecer el diseño del JPanel en null permitiendo un posicionamiento absoluto.Una solución correcta es evitar siempre los diseños nulos y el posicionamiento absoluto y, en cambio, anidar JPanels, cada uno con sus propios diseños, para crear GUI complejas pero flexibles y agradables.


También está configurando el diseño del panel de contenido del JFrame en nulo ; tampoco lo haga.
Y luego agregar un JPanel como ContentPane que usa un FlowLayout predeterminado don no hagas eso.Deje que el diseño del panel de contenido sea BorderLayout.


Editar
Por ejemplo, si dejamos ContentPane solo con su BorderLayout y agregamos otro panel de imagen encima, uno que use GridBagLayout, podemos colocar fácilmente nuestro JButton en la esquina superior izquierda de la GUI si lo deseamos.....

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();
         }
      });
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top