我正在尝试向我的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);
}
答案 0 :(得分:5)
JPanel
默认使用FlowLayout
。这将在一个水平流中布置组件(通常),默认情况下,从顶部中心开始,彼此相邻。
问题是,为什么需要绝对定位
答案 1 :(得分:3)
您当前的问题是上面的代码不尊重默认使用的布局管理器。
最好的解决方案是使用布局管理器为您布置组件,包括嵌套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();
}
});
}
}