2014-12-04 2 views
0

Я пытаюсь создать Java JDialog, где символы отображаются в виде таблицы. На самом деле что-то похожее на CharMap для окон: enter image description hereДиалог таблицы символов Java

Но я столкнулся с некоторыми проблемами:

  1. мне нужно JDialog быть повторно значительным, так что я не могу выбрать, чтобы иметь таблицу в качестве дисплея , потому что он должен быть динамически масштабирован. (Чтобы уточнить, я имею в виду не только настройку ширины каждой ячейки, но и фактическое количество ячеек в строке/столбце)

  2. Символы, очевидно, должны быть обернуты в каком-то удобном для слушателя компоненте. Но если я выберу JButtons, все будет выглядеть неправильно, из-за различной ширины символов в пикселях.

  3. Поскольку я должен прокручивать символы для создания 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

+1

Я хотел бы использовать JTable, чтобы показать символы. – StanislavL

+1

Я использовал 'GridLayout'' JLabel' с подсказками для этого. – trashgod

+0

@StanislavL Но как я могу настроить, например, количество столбцов, если бы я изменил размер диалогового окна? – Haeri

ответ

0

Я бы используйте JButton[][] в GridLayout. Для добавления их к JPanel вы могли бы использовать для в цикле, как так:

for(int row = 0; row < ITEMS-PER-ROW; row++){ 
    for(int col = 0; col < ITEMS-PER-COL; col++){ 
     JButton[row][col] = new JButton(/*SignToShowAs String[][]*/) 
    } 
} 
Смежные вопросы