-2

我正在尝试向我的 JPanel 添加一个按钮并设置位置。我有

buttonOptions.setLocation(1150, 700);

但它将它添加到我的 JPanel 的中间,大约 600、20。我尝试添加

buttonOptions.setLocation(1150, 700);

在将按钮添加到面板后,但这也没有解决。我还设置了设置位置的操作,这很有效

public class StartScreen extends JPanel implements ActionListener{
    ImageIcon imageButtonOptions = new ImageIcon(imageButtonOptionsPath);
    ImageIcon imageButtonOptionsHovered = new ImageIcon(imageButtonOptionsHoveredPath);

    JButton buttonOptions = new JButton(imageButtonOptions);

    public StartScreen() {  
        buttonOptions.setBorderPainted(false);  
        buttonOptions.setFocusPainted(false);  
        buttonOptions.setContentAreaFilled(false);
        buttonOptions.addActionListener(this);
        buttonOptions.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                buttonOptions.setIcon(imageButtonOptionsHovered);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                buttonOptions.setIcon(imageButtonOptions);
            }
        });
        buttonOptions.setLocation(1150, 700);
        add(buttonOptions);
    }
4

2 回答 2

5

JPanel,默认情况下,默认使用 a FlowLayout。这会将组件(通常)以水平流的方式布局,默认情况下,从顶部中心开始,彼此相邻。

问题是,为什么需要绝对定位

于 2013-03-10T05:11:30.803 回答
3

您当前的问题是您上面的代码不尊重默认使用的布局管理器。

最好的解决方案是使用布局管理器为您进行组件布局,包括嵌套 JPanel,每个 JPanel 都使用自己的布局。有些人可能会建议您使用空布局,在大多数情况下这是错误的做法,因为它会使您的程序非常难以维护并且几乎无法升级。

顺便说一句,你想把按钮放在哪里?在 GUI 的右下角?

此外,与其在 JButton 中使用 MouseListener(这通常是一个坏主意),不如将 ChangeListener 添加到 JButton 的模型中。然后您可以轻松查看鼠标是否在按钮上。

编辑
你状态:

是的,右下角。

然后一种方法是使用 GridBagLayout 并将按钮放在右下角,方法是在 GridBagConstraints 参数中使用适当的常量。

编辑 1
例如:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class StartScreen extends JPanel implements ActionListener {
   private static final int PREF_W = 1200;
   private static final int PREF_H = 720;
   JButton buttonOptions = new JButton("Options");

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public StartScreen() {
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
            GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE, new Insets(
                  5, 5, 5, 5), 0, 0);
      add(buttonOptions, gbc);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      // TODO Auto-generated method stub

   }

   private static void createAndShowGui() {
      StartScreen mainPanel = new StartScreen();

      JFrame frame = new JFrame("StartScreen");
      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();
         }
      });
   }
}

编辑 2
现在使用在悬停或“翻转”时更改的图标。我错了——没必要听 ButtonModel 的状态。只需设置按钮的图标及其翻转图标,按钮就会为您交换它们:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

@SuppressWarnings("serial")
public class StartScreen extends JPanel {
   private static final int PREF_W = 1200;
   private static final int PREF_H = 720;
   private static final int BI_WIDTH = 100;
   private static final int BI_HEIGHT = 30;

   private JButton buttonOptions = new JButton();
   private Icon nonHoveredIcon;
   private Icon hoveredIcon;

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public StartScreen() {
      hoveredIcon = createIcon("Hovered");
      nonHoveredIcon = createIcon("Non-Hovered");

      buttonOptions.setIcon(nonHoveredIcon);
      buttonOptions.setRolloverIcon(hoveredIcon);

      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
            GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE, new Insets(
                  5, 5, 5, 5), 0, 0);
      add(buttonOptions, gbc);
   }

   private ImageIcon createIcon(String text) {
      BufferedImage img = new BufferedImage(BI_WIDTH, BI_HEIGHT, 
            BufferedImage.TYPE_INT_ARGB);
      Graphics g = img.getGraphics();
      g.setColor(Color.black);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
            RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
      g.drawString(text, 10, 20);
      g.dispose();
      return new ImageIcon(img);
   }

   private static void createAndShowGui() {
      StartScreen mainPanel = new StartScreen();

      JFrame frame = new JFrame("StartScreen");
      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();
         }
      });
   }
}
于 2013-03-10T05:09:13.550 回答