Когда я запускаю, JList показывает строки:
javax.swing.JRadioButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5....
]
Могу ли я знать, что случилось и как решить эту проблему?
Это происходит потому, что ваш JList
имеет DefaultListCellRenderer. Как видите, этот класс extends
JLabel
.Метод DefaultListCellRenderer#getListCellRendererComponent()
получает аргумент Object value
.Тип этого значения равен типу вашего JList
.
С учетом сказанного ваш JList
имеет JRadioButton
в качестве универсального типа (JList< JRadioButton>
), что означает, что значение объектаJRadioButton
.
Теперь, DefaultListCellRenderer
, чтобы получить его текст, он вызывает метод значения toString()
, следовательно, вы получаете этот вид текста в ячейках вашего списка.(Метод toString()
для JRadioButton возвращает его детали, координаты, размеры и т. Д.)
Решение:
Было бы использоватьcustom ListCellRenderer .Таким образом, вы можете отобразить любое значение-свойство аргумента с именем "value" i в методе getListCellRendererComponent()
.В вашем случае вам нужно сделать JRadioButton
.
. Я поделюсь примером с комментариями внутри кода , чтобы лучше это понять.
SSCCE:
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JRadioButton;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
public class JListJRadioButtonRenderer extends JFrame {
public JListJRadioButtonRenderer() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addList();
setSize(300, 300);
setLocationRelativeTo(null);
}
private void addList() {
JList<JRadioButton> list = new JList<>();
DefaultListModel<JRadioButton> model = new DefaultListModel<>();
// Add the custom renderer.
list.setCellRenderer(new ListCellRenderer<JRadioButton>() {
@Override
public Component getListCellRendererComponent(JList<? extends JRadioButton> list, JRadioButton value,
int index, boolean isSelected, boolean cellHasFocus) {
// Fix background for selected cells.
value.setBackground(isSelected ? list.getSelectionBackground() : null);
// Select the JRadioButton too since it is selected in the list.
value.setSelected(isSelected);
return value;
}
});
list.setModel(model);
JRadioButton stackButton = new JRadioButton("Hello Stack");
JRadioButton overButton = new JRadioButton("Hello Over");
JRadioButton flowButton = new JRadioButton("Hello Flow");
model.addElement(stackButton);
model.addElement(overButton);
model.addElement(flowButton);
getContentPane().add(list);
JButton printSelected = new JButton("Print selected");
printSelected.addActionListener(e -> {
List<JRadioButton> selectedButtons = list.getSelectedValuesList();
for (JRadioButton r : selectedButtons)
System.out.println(r.getText());
});
getContentPane().add(printSelected, BorderLayout.PAGE_END);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new JListJRadioButtonRenderer().setVisible(true));
}
}
Предварительный просмотр: