Позиционирование JButton на JFrame не отображается [дубликат]

StackOverflow https://stackoverflow.com//questions/24006147

Вопрос

Я знаю, что это ужасное кодирование, но мне отчаянно нужно решить эту проблему.Я пробовал несколько способов размещения кнопки, но она по-прежнему остается вверху по центру, а все остальные кнопки выстраиваются в ряд после нее.

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 что позволяет обеспечить абсолютное позиционирование.Правильное решение — всегда избегать нулевых макетов и абсолютного позиционирования и вместо этого вкладывать JPanels, каждый из которых использует свои собственные макеты, чтобы создавать сложные, но гибкие и приятные графические интерфейсы.


Вы также устанавливаете для макета JFrame contentPane значение null — не делайте этого.
А затем добавьте JPanel в качестве contentPane, который использует FlowLayout по умолчанию - не делайте этого.Пусть макет contentPane будет BorderLayout.


Редактировать
Например, если мы оставим contentPane с его BorderLayout и добавим поверх него еще одну панель изображений, использующую GridBagLayout, мы сможем легко расположить нашу JButton в верхнем левом углу графического интерфейса, если это необходимо.....

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();
         }
      });
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top