#java #swing #arraylist
#java #качать #arraylist
Вопрос:
Я кодирую небольшую игру, в которой в одном классе (с именем Brick), который расширяет JPannel, у меня есть JButton, работающий как «Кирпич», а в другом классе, который расширяет JFrame, у меня есть ArrayList из кирпича с именем Grid, который содержит кирпичи.Но я не знаю, как представить кирпичи ArrayList из кирпичей в последовательной форме, т.Е. Один за другим, в JFrame класса Grid.Пожалуйста, дайте мне несколько предложений.
РЕДАКТИРОВАТЬ: я также не хочу пробелов между двумя кнопками.Как я могу вставить две кнопки, разделяя границы?
Комментарии:
1. @nachokk Является
GridBagLayout
ли класс полезным здесь? Должен ли я прочитать этот класс для этой проблемы?2. Да, GridBagLayout является мощным, но, возможно, вам нужно только GridLayout или простое потоковое описание
Ответ №1:
Вы можете использовать следующий фрагмент кода для добавления и массива настраиваемых классов 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;
}
}
}
В качестве альтернативы, вы всегда можете расположить свои JButtons вертикально на JPanel (возможно, используя новый GridLayout (0,1)), а затем поместить свою JPanel в JScrollPane, таким образом, имитируя JList JButtons.
Комментарии:
1. Могу ли я сделать это с помощью GridBagLayout?
2. да, любой макет, поддерживающий jlist, также будет поддерживать buttonlist