2013-03-10 140 views
-2

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

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

代替的MouseListener你大概可以使用'setRolloverIcon(...)'方法。 – camickr 2013-03-10 05:17:10

回答

3

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

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

顺便说一下,你想在哪里放置按钮?在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(); 
     } 
     }); 
    } 
} 
+0

是的,在右下角。 – MillerTime 2013-03-10 05:11:23

+0

@MillerTime:请参阅编辑。 – 2013-03-10 05:12:54

+1

我不同意调用null布局邪恶是有益的。一个简单的工具比使用布局管理器更简单,更有效地实现使用空布局。布局管理器是很多java程序员,尤其是初学者讨厌java的原因。做不止一种方法,没有“正确的方式”去做某件事,并说“在大多数情况下做错事是纯粹的主观的”。在大多数情况下,这是正确的做法,因为它更容易实现,测试并转变为布局管理器。祝你好运,保持gridbaglayout作为初学者。 – Dmitry 2013-03-10 05:13:19

5

JPanel,默认情况下,在默认情况下使用FlowLayout。这样会将组件(通常)排列在水平流中,默认情况下从顶部中心开始一个接一个地排列。

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

+0

正好!和1 + – 2013-03-10 05:13:29

+0

我在技术上不需要绝对定位,但它会更好,我忘了面板默认使用了flowlayout,所以我需要将它设置为null。不幸的是,将布局设置为null会导致按钮不能绘制 – MillerTime 2013-03-10 05:17:52

+3

将布局管理器设置为空,不仅要求您定位组件,还要提供大小。绝对定位一般不会鼓励Swing出来很好的理由(对不起,我哈哈我已经在我的膝盖上睡了10个月,所以我不能在一个月内减少一个例子) – MadProgrammer 2013-03-10 05:18:58