現在の問題は、上記のコードがデフォルトで使用されているレイアウト マネージャーを考慮していないことです。
最良の解決策は、レイアウト マネージャーを使用して、それぞれ独自のレイアウトを使用するネストされた 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();
}
});
}
}