【问题标题】:How to add ArrayList of JButton on a JFrame?如何在 JFrame 上添加 JButton 的 ArrayList?
【发布时间】:2014-06-26 19:12:28
【问题描述】:

我正在编写一个小游戏,其中,在一个扩展 JPanel 的类(名为 Brick)中,我有一个作为“Brick”工作的 JButton,在另一个扩展 JFrame 的类中,我有一个名为 Grid 的 Brick ArrayList砖块。但我不知道如何在网格类的 JFrame 上以串行形式表示砖块的 ArrayList 砖块,即在另一个之后的一个。请给我一些建议。
编辑:我也希望两个按钮之间没有空间。我怎样才能粘贴两个按钮,共享边界?

【问题讨论】:

  • @nachokk GridBagLayout 类在这里有用吗?我应该为这个问题阅读该类吗?
  • 是的 GridBagLayout 很强大,但也许你只需要一个 GridLayout 或者一个简单的 FlowLayout

标签: java swing arraylist


【解决方案1】:

您可以使用下面的代码 sn-p 来添加和自定义 JButton 类的数组。 您可以根据需要进行编辑。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

/**
 * A JList of JButtons.
 */
public class JButtonListDemo implements Runnable
{
  private JList jlist;

  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new JButtonListDemo());
  }

  public void run()
  {
    Object[] items = new ButtonItem[] {
        new ButtonItem("Apple"),
        new ButtonItem("Banana"),
        new ButtonItem("Carrot"),
        new ButtonItem("Date"),
        new ButtonItem("Eggplant"),
        new ButtonItem("Fig"),
        new ButtonItem("Guava"),
    };

    jlist = new JList(items);
    jlist.setCellRenderer(new ButtonListRenderer());
    jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jlist.setVisibleRowCount(5);
    jlist.addMouseListener(new MouseAdapter()
    {
      @Override
      public void mouseClicked(MouseEvent event)
      {
        clickButtonAt(event.getPoint());
      }
    });

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(jlist));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  private void clickButtonAt(Point point)
  {
    int index = jlist.locationToIndex(point);
    ButtonItem item = (ButtonItem) jlist.getModel().getElementAt(index);
    item.getButton().doClick();
//    jlist.repaint(jlist.getCellBounds(index, index));
  }

  public class ButtonItem
  {
    private JButton button;

    public ButtonItem(String name)
    {
      this.button = new JButton(name);
      button.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
          System.out.println(button.getText() + " was clicked.");
        }
      });
    }

    public JButton getButton()
    {
      return button;
    }

    @Override
    public String toString()
    {
      return button.getText();
    }
  }

  class ButtonListRenderer extends JButton implements ListCellRenderer
  {
    public Component getListCellRendererComponent(JList comp, Object value, int index,
                                              boolean isSelected, boolean hasFocus)
    {
      setEnabled(comp.isEnabled());
      setFont(comp.getFont());
      setText(value.toString());

      if (isSelected)
      {
        setBackground(comp.getSelectionBackground());
        setForeground(comp.getSelectionForeground());
      }
      else
      {    
        setBackground(comp.getBackground());
        setForeground(comp.getForeground());
      }

      return this;
    }
  }
}

或者,您总是可以在 JPanel 上垂直布局 JButton(可能使用新的 GridLayout(0,1)),然后将 JPanel 放在 JScrollPane 中,从而模拟 JButton 的 JList。

【讨论】:

  • 我可以用 GridBagLayout 做吗?
  • 是的,任何支持 jlist 的布局也将支持 buttonlist
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多