-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 を含むコンポーネントのレイアウトを行うことです。null レイアウトを使用することを提案する人もいますが、ほとんどの場合、プログラムの保守が非常に困難になり、アップグレードがほぼ不可能になるため、これは間違った方法です。

ところで、ボタンをどこに配置しようとしていますか?GUI の右下隅にありますか?

また、JButton で MouseListener を使用するのではなく (通常は悪い考えです)、JButton のモデルに ChangeListener を追加することをお勧めします。次に、マウスがボタンの上にあるかどうかを簡単に確認できます。

あなたの状態を編集
:

はい、右下隅です。

1 つの方法は、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 に答える