Я пытаюсь создать Java JDialog, где символы отображаются в виде таблицы. На самом деле что-то похожее на CharMap для окон: Диалог таблицы символов Java
Но я столкнулся с некоторыми проблемами:
мне нужно JDialog быть повторно значительным, так что я не могу выбрать, чтобы иметь таблицу в качестве дисплея , потому что он должен быть динамически масштабирован. (Чтобы уточнить, я имею в виду не только настройку ширины каждой ячейки, но и фактическое количество ячеек в строке/столбце)
Символы, очевидно, должны быть обернуты в каком-то удобном для слушателя компоненте. Но если я выберу JButtons, все будет выглядеть неправильно, из-за различной ширины символов в пикселях.
Поскольку я должен прокручивать символы для создания JButtons, я могу создавать объекты без имени. Итак, как мне узнать, какая кнопка была нажата?
вот что у меня до сих пор:
код Обновлено 05.12.2014
import java.awt.Dimension;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
public class SymbolDialog extends JDialog{
private char[] math = {8704, 8707, 8708, 8710, 8712, 8713, 8715, 8716, 8721, 8723, 8728, 8730, 8734, 8743, 8744, 8745, 8746, 8747, 8776, 8793, 8800, 8801, 8804, 8805, 8834, 8835, 8836, 8837, 8838, 8839};
private final String[] sTypes = {"Math","Logic", "Arrows"};
private JPanel pan = new JPanel();
public SymbolDialog(){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
System.out.println("catdch 1");
} catch (InstantiationException e1) {
System.out.println("catdch 2");
} catch (IllegalAccessException e1) {
System.out.println("catdch 3");
} catch (UnsupportedLookAndFeelException e1) {
System.out.println("catdch 4");
}
SwingUtilities.updateComponentTreeUI(this);
pan.setPreferredSize(new Dimension(428, 70));
pan.setLayout(new ColumnsFlowLayout(0,0));
// Button Build
for (int i = 0; i < math.length; i++){
pan.add(new JButton(math[i]+""));
}
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0};
gridBagLayout.rowHeights = new int[]{0, 0, 0};
gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
getContentPane().setLayout(gridBagLayout);
JPanel panel = new JPanel();
panel.setBorder(new EmptyBorder(5,10,0,10));
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.anchor = GridBagConstraints.WEST;
gbc_panel.fill = GridBagConstraints.VERTICAL;
gbc_panel.insets = new Insets(0, 0, 5, 0);
gbc_panel.gridx = 0;
gbc_panel.gridy = 0;
getContentPane().add(panel, gbc_panel);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{0, 0, 0};
gbl_panel.rowHeights = new int[]{0, 0};
gbl_panel.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
panel.setLayout(gbl_panel);
JLabel lblCathegorie = new JLabel("Categories:");
GridBagConstraints gbc_lblCathegorie = new GridBagConstraints();
gbc_lblCathegorie.insets = new Insets(0, 0, 0, 5);
gbc_lblCathegorie.gridx = 0;
gbc_lblCathegorie.gridy = 0;
panel.add(lblCathegorie, gbc_lblCathegorie);
JComboBox<Object> comboBox = new JComboBox<Object>(sTypes);
GridBagConstraints gbc_comboBox = new GridBagConstraints();
gbc_comboBox.gridx = 1;
gbc_comboBox.gridy = 0;
panel.add(comboBox, gbc_comboBox);
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 1;
getContentPane().add(pan, gbc_scrollPane);
// Pack
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setResizable(true);
pack();
setTitle("Symbols");
setVisible(true);
}
public void actionPerformed(ActionEvent event) {
//TODO sysout which symbol was clicked
System.out.println(((JButton) event.getSource()).getText());
}
public static void main(String[] args){
new SymbolDialog();
}
}
пс: Я использую рекомендованную columns_flow_layout от here
Я хотел бы использовать JTable, чтобы показать символы. – StanislavL
Я использовал 'GridLayout'' JLabel' с подсказками для этого. – trashgod
@StanislavL Но как я могу настроить, например, количество столбцов, если бы я изменил размер диалогового окна? – Haeri